2013-03-05 102 views
0

全部,JSF轉換器:驗證錯誤:值無效

我一直在閱讀和搜索,雖然它有幾個itens,似乎我失去了一些東西。 我的表單在selectOneListBox的轉換過程中始終失敗

我已經閱讀和搜索,但到目前爲止我還沒有找到導致此問題的原因。是 據我已閱讀並發現可能的原因如下:

  1. 的的Object.Equals()不正確
  2. 菜單的列表是空的。

在線是一個基於用戶類我的轉換器:

ticketUpdateController.lovResearchers - 類型列表 - 從JpaController獲得的列表:

@FacesConverter("misc.util.UserConverter") 
public class UserConverter implements Converter { 
    private static HashMap<String, Users> map = new HashMap<String, Users>(); 
    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     Users user = map.get(value); 
     Logger.getGlobal().log(Level.INFO, "UserConverter - getAsObject " + user.getEmail()); 
     Logger.getGlobal().log(Level.INFO, "UserConverter - getAsObject value " + value); 
     return user; 
    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     Users user = (Users)value; 
     map.put(user.getEmail().toString(), user); 
     Logger.getGlobal().log(Level.INFO, "UserConverter - getAsString"); 
     return user.getEmail().toString(); 
    } 
} 

發生故障的代碼。 ticketUpdateController.researcher - type Users

我試圖添加inputHidden,因爲這個頁面有一個viewParam,我需要保持這個值刷新。雖然沒有它,但情況也是如此。

<p:dialog id="assignResearcherDialog" header="Assign Researcher" widgetVar="assignResearcher" resizable="false"> 
     <h:form id="assignResearcherForm"> 
      <p:panel> 
       <p:selectOneListbox id="selRec" value="#{ticketUpdateController.researcher}"> 
        <f:selectItems value="#{ticketUpdateController.lovResearchers}" var="r" itemLabel="#{r.email}" itemValue="#{r}"></f:selectItems> 
        <f:converter converterId="misc.util.UserConverter"></f:converter> 
        <h:inputHidden value="#{ticketUpdateController.ticketNumber}"></h:inputHidden> 
       </p:selectOneListbox> 
       <p:commandButton value="Assign" actionListener="#{ticketUpdateController.setResearcher}" oncomplete="handleSubmitRequest(xhr, status, args, 'assignResearcherDialog','assignResearcherForm');" update=":ticketUpdateForm :message"> 
        <h:inputHidden value="#{ticketUpdateController.ticketNumber}"></h:inputHidden> 
        <f:param id="tnr" value="#{ticketUpdateController.ticketNumber}"></f:param> 
       </p:commandButton> 
      </p:panel> 
     </h:form> 
    </p:dialog> 

我的故障排除:

  • 我檢查用戶類和平等是根本沒有被調用。 (通過將記錄器放在那裏來檢查)
  • 將日誌記錄放入轉換器類中以查看它何時被調用。到目前爲止,它似乎被稱爲當它的neede。 JSF頁面加載,當我按下一些按鈕。
  • 添加了loggerto的TicketUpdateController bean的init,以便我可以看到這些值是否仍在內存中。
 
WARNING: class gui.controller.TicketUpdateController Starting... 
WARNING: class gui.controller.TicketUpdateController Setting Values... 
INFO: UserConverter - getAsString INFO: UserConverter - getAsString 
INFO: UserConverter - getAsString INFO: UserConverter - getAsString 
WARNING: class gui.controller.TicketUpdateController Starting... 
WARNING: class gui.controller.TicketUpdateController Setting Values... 
INFO: UserConverter - getAsString INFO: UserConverter - getAsString 
INFO: UserConverter - getAsString INFO: UserConverter - getAsString 
INFO: UserConverter - getAsObject [email protected] 
INFO:UserConverter - getAsObject value [email protected] 
WARNING: class gui.controller.TicketUpdateController Starting... 
+1

如果'ticketUpdateController.lovResearchers'的狀態不一致,則也會發生這種情況。你如何/在哪裏初始化列表? 'map.put(user.getEmail()。toString(),user);'也可能不是一個好主意。確保沒有數據存儲區應該被修改是最安全的。midrequest – kolossus 2013-03-06 02:27:02

+0

lovResearchers正在@PostContruct init中創建,其中包含以下內容:this.setLovResearchers(ujc.findUsersEntitiesByRole(「Researcher」)); 轉換器中的地圖只與轉換器本身有關。這個轉換器基本上是另一個我爲另一個類(角色)的副本,在這種情況下,它工作正常。 我會嘗試把故事中的角色轉換器放在這裏,因爲我知道這個角色轉換器可以在另一個頁面中工作,看看會發生什麼。 – 2013-03-06 05:55:58

回答

0

發現了什麼是錯誤的。

所以基本上我使用了錯誤的類。
我的頁面bean是TicketUpdateController,但我的轉換器是爲用戶。

因此,我將字段int從TicketUpdateController中的SelectedItems更改爲UsersController。

畢竟我應該從UsersController而不是TicketUpdatecontroller獲取所有用戶。