У меня есть форма jsf в моем приложении, которая должна отображать несколько полей ввода для создания/редактирования сотрудников. Существует несколько отделов, которые я хочу отобразить с помощью <h:selectOneMenu>
. Моими другими компонентами являются в основном компоненты primefaces
.Сессия scoped selectOneMenu значение возвращается к умолчанию после обновления страницы
Если я выбираю существующего сотрудника из моего документа, отдел настроен правильно (в интерфейсе и компоненте). Я проверил конвертер и это метод getAsString()
в режиме отладки. Оба, похоже, работают нормально.
Но когда я обновляю страницу с помощью [F5], она меняет значение в <h:selectOneMenu>
на предыдущую, но значение bean's по-прежнему прекрасное. Кажется, что привязка между моим сеансовым компонентом и компонентом jsf работает некорректно.
Кроме того, есть еще одна проблема, когда я хочу сохранить любого сотрудника. Проверка подтверждает, что значение selectOneMenu
недействительно. Эта ошибка возникает после того, как метод getAsObject()
успешно возвращает мое подразделение pojo. Я не определял никаких валидаторов для этого конкретного компонента, но я использую несколько компонентов ввода, которые не должны быть пустыми. Эта ошибка может возникнуть из-за проблемы с установкой значения, как указано выше.
DepartmentConverter.java
@ManagedBean(name="departmentConverter")
public class DepartmentConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
DepartmentDAOImpl deptUtils = new DepartmentDAOImpl();
try {
int code = Integer.parseInt(value);
return deptUtils.getDepartmentById(code);
} catch (NumberFormatException nfe) {
System.out.println("Couldn't transform department code from string to int");
nfe.printStackTrace();
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return ((Department) value).getCode() + "";
}
}
SampleJSFBean.java
@ManagedBean(name = "sampleBean")
@SessionScoped
public class SampleJSFBean {
private Task employee;
private List<Task> employees;
private List<Department> departments;
private Department department;
public String showEditEmployeePanel() {
// shows panel
}
public String updateEmployee() {
// saves employee
}
// getter and setter
}
registration.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<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="/templates/BasicTemplate.xhtml">
<ui:define name="content">
<h:form id="formResult">
<p:panel>
<p:dataTable id="employee" var="task" value="#{sampleBean.employees}">
<p:column headerText="Code">
<h:outputText value="#{task.employee.code}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{task.employee.lastname}" />
</p:column>
<p:column headerText="Department">
<h:outputText value="#{task.employee.department.name}" />
</p:column>
<p:column headerText="edit">
<p:commandButton id="btnMut" icon="ui-icon-pencil" title="edit employee" disabled="#{task.jobActive == true}" action="#{sampleBean.showEditEmployeePanel}"
update=":formEmployee" resetValues="true">
<f:setPropertyActionListener value="#{task}" target="#{sampleBean.task}" />
</p:commandButton>
</p:column>
</p:dataTable>
</p:panel>
</h:form>
<h:form id="formEmployee">
<p:growl autoUpdate="false" />
<p:panel id="panelEmployee">
<h:outputText value="Lastname" styleClass="labelForm" />
<p:inputText id="inputLastname" value="#{sampleBean.task.employee.lastname}" required="true" requiredMessage="Please enter lastname." />
<br />
<h:outputText value="Department" styleClass="labelForm" />
<h:selectOneMenu value="#{sampleBean.department}" converter="#{departmentConverter}">
<f:selectItems value="#{sampleBean.departments}" var="dept" itemLabel="#{dept.code} - #{dept.name}" />
</h:selectOneMenu>
<br />
<p:commandButton value="save" action="#{sampleBean.updateEmployee}" icon="ui-icon-disk" update=":formResult :formEmployee" />
</p:panel>
</h:form>
</ui:define>
Итак, вы получили эту точную ошибку? http://stackoverflow.com/questions/9069379/validation-error-value-is-not-valid Другими словами, метод 'equals()' вашего объекта 'Department' отсутствует или сломан? – BalusC
Благодаря BalusC, который спас мой день еще раз! Метод 'equals()' отсутствовал, поэтому мне не удалось сохранить. По-прежнему существует ошибка, потому что компонент всегда показывает старое значение, если я обновляю страницу, но это небольшая ошибка. –
Добро пожаловать :) – BalusC