2015-12-22 59 views
0

我的应用程序中有一个jsf表单,该表单应显示用于创建/编辑员工的多个输入字段。我想用<h:selectOneMenu>显示几个部门。我的其他组件基本上都是primefaces组件。会话范围selectOneMenu值在刷新页面后更改回默认页面

如果我从我的数据表中选择一个现有员工,部门设置正确(在前端和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

那么,你有这个确切的错误? http://stackoverflow.com/questions/9069379/validation-error-value-is-not-valid换句话说,你的'Department'对象的'equals()'方法缺失或损坏? – BalusC

+0

感谢BalusC再次拯救了我的一天! 'equals()'方法丢失了,所以我无法保存。还有一个错误,因为如果我刷新页面,组件始终显示旧值,但这是一个小错误。 –

+0

不客气:) – BalusC

回答

-1

您是否尝试过使用primefaces组件而不是<h:selectOneMenu>使用<p:selectOneMenu>。 我不确定它有帮助,但我总是使用primeFaces的selectOneMenu并始终正常工作。

+0

不幸的是,这与使用'' –

+0

原因,为什么bean在刷新后保持旧值在控制器bean的'@ SessionScope'中我使用'@Scope(“view”)' – Victor1125

+0

这篇文章比作为回答更适合作为评论。您有足够的声望将评论发布为任何地方的真实评论。 – BalusC