Свойство f:viewParam воссоздается при отправке через конвертер

У меня есть следующая страница JSF. я пас id в качестве параметра к нему и конвертер создает объект в компоненте поддержки, используя этот идентификатор. Эта страница предназначена для редактирования существующей записи в базе данных. Когда нажата кнопка Сохранить roleInformation объект воссоздан с использованием конвертера, и, таким образом, новый name а также description от inputtext не установлен, как я могу это исправить? Как предотвратить Converter от вставки нового roleInformation когда commandButton нажал?

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:f="http://java.sun.com/jsf/core"
            xmlns:p="http://primefaces.org/ui"
            template="/WEB-INF/template.xhtml">
<ui:define name="metadata">
    <f:metadata>
        <f:viewParam name="id" value="#{roleEdit.roleInformation}"
                     converter="#{roleConverter}"
                     required="true" requiredMessage="Bad request, please use a link from within the system."
                />
        <f:viewAction action="#{roleEdit.init}"/>
    </f:metadata>
</ui:define>
<ui:define name="content">

    <h3>Here you can edit information about the single role #{param} </h3>

    <h:form>
        <p:dataTable id="roleTable" var="roleInformation" value="#{roleEdit.roleInformation}">
            <p:column headerText="Id">
                <h:outputText value="#{roleInformation.id}"/>
            </p:column>
            <p:column headerText="Name">
                <p:inputText value="#{roleInformation.name}"/>
            </p:column>
            <p:column headerText="Description">
                <p:inputText value="#{roleInformation.description}"/>
            </p:column>
        </p:dataTable>
        <br/>
        <p:pickList value="#{roleEdit.rightInformations}" var="rightInformation" itemLabel="#{rightInformation.id}"
                    itemValue="#{rightInformation}" converter="#{rightConverter}">
            <f:facet name="sourceCaption">Available</f:facet>
            <f:facet name="targetCaption">Role rights</f:facet>
            <p:column style="width:100%">
                #{rightInformation.name}
            </p:column>
        </p:pickList>
        <p:commandButton value="Save" action="#{roleEdit.save}">
        </p:commandButton>
    </h:form>
</ui:define>

ОБНОВИТЬ

@ManagedBean(name = "roleEdit")
@ViewScoped
public class Edit implements Serializable {

private DualListModel<RightInformation> rightInformations;
private RoleInformation roleInformation;

@Inject
@RoleServiceJPA
private RoleService roleService;

@Inject
@RightServiceJPA
private RightService rightService;

public void init() {
    List<RightInformation> target = new ArrayList<>();
    List<RightInformation> source = rightService.find(null);
    source.removeAll(roleInformation.getRightInformations());
    target.addAll(roleInformation.getRightInformations());
    rightInformations = new DualListModel<>(source, target);
    System.out.println("init roleinfor tostring " + roleInformation.toString());
}

public String save() {
    System.out.println("role save to string " + roleInformation.toString());
    System.out.println(roleInformation.getName());
    System.out.println(roleInformation.getDescription());
    roleInformation.getRightInformations().clear();
    roleInformation.getRightInformations().addAll(rightInformations.getTarget());
    roleService.updateRole(roleInformation);
    return "role?faces-redirect=true&id=" + roleInformation.getId();
}

РольИнформационный интерфейс

public interface RoleInformation {
long getId();

String getName();

String getDescription();

List<RightInformation> getRightInformations();

void setName(String name);

void setDescription(String description);

}

RoleConverter

@ManagedBean
@FacesConverter(forClass = RoleInformation.class)
public class RoleConverter implements Converter, Serializable {

@Inject
@RoleServiceJPA
private RoleService roleService;

@Override
public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
    if (value == null || value.isEmpty()) {
        return null;
    }

    Long id = Long.valueOf(value);
    return roleService.findSingle(id);
}

@Override
public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
    return Long.toString(((RoleInformation) o).getId());
}
}

1 ответ

Решение

Проблема заключалась в том, что бэк был восстановлен, когда я нажал commandButton, @ManagedBean была аннотация JSF, после переключения на @Named я смог достичь того, чего хотел (бэк не был воссоздан, поэтому я смог сохранить String от inputText).

Другие вопросы по тегам