2015-12-22 60 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