刷新页面后,会话范围的selectOneMenu值将更改回默认值

时间:2015-12-22 09:38:20

标签: jsf jsf-2 primefaces converter

我的应用程序中有一个jsf表单,它应该显示几个用于创建/编辑员工的输入字段。我想用<h:selectOneMenu>显示几个部门。我的其他组件基本上是primefaces组件。

如果我从我的数据表中选择现有员工,则部门设置正确(在前端和bean中)。我在调试模式下检查了转换器及其getAsString()方法。两者似乎都很好。

但是当我用[F5]刷新页面时,它会将<h:selectOneMenu>中的值更改回前一个,但bean的值仍然很好。似乎我的会话bean和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>

1 个答案:

答案 0 :(得分:-1)

您是否尝试过使用primefaces组件<h:selectOneMenu>使用<p:selectOneMenu>。  我不确定它有用,但我总是使用primeFaces的selectOneMenu并且始终有效。