Свойство 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
).