У меня есть страница JSF. Я передаю id
в качестве параметра для него, и конвертер создает объект в бэкэнде, используя этот идентификатор. Это страница в основном для редактирования существующей записи в базе данных. При нажатии на сохранение мой объект roleInformation
воссоздается с использованием конвертера, и поэтому новые name
и description
от inputtext
не установлены, как я могу его исправить? Как предотвратить Converter
от вставки нового roleInformation
при нажатии commandButton
?f: viewParam bean property recreated on submit via Converter
<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>
UPDATE
@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();
}
RoleInformation Интерфейс
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());
}
}
Вы имеете в виду, что он воссоздан * после * его сеттеры вызывается из входов? Это не ожидаемое поведение. – BalusC
@BalusC добавил больше кода, если это помогает, но из того, что я вижу на выходе, я считаю, что он воссоздан после того, как его сеттеры вызывается, так как 'name' и' description' не равны тому, что я вводил в 'inputText' , – Asiat