2012-11-11 53 views
4

嘗試從我的應用程序中的表中刪除或編輯用戶時,出現轉換錯誤。該值將從listUser.xhmtldeleteUser.xhtml頁面的元數據中傳遞。該值正在元數據中傳遞,但由於某種原因,在調用刪除操作時,我得到Conversion Error setting value "[email protected]" for 'null Converter'。用戶標識是一個字符串。'null Converter'的轉換錯誤設置值「UserID」

這是URL請求userDelete.xhmtl後:

http://localhost:8080/lavpWebApp/user/deleteUser.xhtml?user=someemail%40somedomain.com 

這是簡化了userList.xhmtl:

<h:column> 
          <f:facet name="header">Edit</f:facet> 
          <h:link outcome="/user/editUser.xhtml" value="Edit User"> 
           <f:param name="user" value="#{item.email}"/> 
          </h:link>        
         </h:column> 

         <h:column> 
          <f:facet name="header">Delete</f:facet> 
          <h:link outcome="/user/deleteUser.xhtml" value="Delete User"> 
           <f:param name="user" value="#{item.email}"/> 
          </h:link> 
         </h:column> 

這userDelete.xhtml簡化:

<f:metadata> 
     <f:viewParam name="user" value="#{userController.user}" converter="#{userConverter}"/> 
    </f:metadata> 

    <h:body> 
     Do you want to delete #{userController.user.name}? 
     <h:form> 
      <h:commandButton action="#{userController.deleteUser()}" 
          value="Delete"/> 
      <h:commandButton action="#{userController.doCancelDeleteUser()}" 
          value ="Cancel"/> 
     </h:form> 
    </h:body> 

這是轉換器類:

@ManagedBean 
@FacesConverter(value="userConverter") 
public class UserConverter implements Converter{ 

    @EJB 
    private UserSellerEJB userEjb; 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String value) { 
     if (value == null || value.isEmpty()) 
     { 
      return null; 
     } 
     if(!value.matches("\\d+")) 
     { 
      throw new ConverterException("The value is not a valid email: " + value); 
     } 

     String id = value.toString(); 
     return userEjb.findUserById(id); 

    } 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     if(value == null) 
     { 
      return null; 
     } 

     if(!(value instanceof UserSeller)) 
     { 
      throw new ConverterException("The value is not a User: " + value);    
     } 

     String id = ((UserSeller) value).getEmail(); 
     return (id != null) ? id.toString() : null; 
    } 

} 

這是簡化了UserController類:

@Named 
@RequestScoped 
public class UserController{ 

    @EJB 
    private UserSellerEJB userEJB; 

    private UserSeller user = new UserSeller(); 
    private List<UserSeller> usersList = new ArrayList<UserSeller>(); 

    // ------------------------------------------------------------- Constructor 
    public UserController() { 
    } 

    // -------------------------------------------------------- Business Methods 

    public String doCreateUser() 
    { 
     user = userEJB.createSeller(user); 
     usersList = userEJB.findAllSellers(); 
     return "listUser?faces-redirect=true";   
    } 

     // update user 

     public void PreRenderView() 
     { 
      if(user == null) 
      { 
       user = new UserSeller(); 
      }    
     } 

     public String doUpdateUser() 
     { 
      if(user.getEmail() != null) 
      { 
       userEJB.updateSeller(user); 
      } 
      else 
      { 
       userEJB.createSeller(user); 
      } 

      return "listUser?faces-redirect=true"; 
     } 

    public String deleteUser() 
    { 
     userEJB.deleteSeller(user); 
     return "listUser?faces-redirect=true"; 
    } 

    public String doCancelDeleteUser() 
    { 
     return "listUser?faces-redirect=true"; 
    } 


    @PostConstruct 
    public void init() 
    { 
     usersList = userEJB.findAllSellers();  
    } 
+0

嘗試爲'@ ManagedBean'註釋分配一個'name'並使用它來訪問轉換器。確保它與'@ FacesConverter'中已經使用的不同# – kolossus

+0

@ @ ManagedBean'不能具有'@ FacesConverter'註釋。刪除代碼將運行的'@ ManagedBean'註釋。順便說一句,你將JSF和CDI混合在一起,研究它們和它們的區別會更好。相關:[使用JEE6將EJB注入JSF轉換器](http://stackoverflow.com/q/2019495/1065197)。 –

+0

@kolossus謝謝。我已經給'@ ManagedBean'添加了'name',我使用了@ManagedBean(name =「userSellerConverter」),但它仍然給出了相同的錯誤。 – lv10

回答

5

在異常消息的null converter指示轉換器實例不能被發現。由於您通過converter="#{userConverter}將轉換器作爲託管bean進行引用,因此只有在註釋爲@javax.faces.bean.ManagedBean並且該類位於WAR(因此不在EJB/EAR或其他位置!)中時纔會找到該轉換器。

@FacesConverter註釋並未在此構造中使用,實際上也是多餘的—,只會讓初學者感到困惑。刪除該註釋。 @EJB確實只適用於託管的bean。

如果確實是徒勞的(我可能無法解釋爲什麼),請嘗試通過CDI進行管理:用CDI @Named註釋替換JSF @ManagedBean註釋。你顯然已經成功地通過CDI管理前端控制器bean。


無關的具體問題,轉換器似乎是設計基於技術的ID(一個數據庫主鍵),而不是電子郵件地址轉換。一個電子郵件地址永遠不會匹配\d+(這是「僅限數字」的正則表達式)。確保您不會將電子郵件地址與ID混淆。

+0

非常感謝您的詳細建議。我遵循了你的指示,我刪除了@ @ FacesConverter註解,我也替換了'@Named(「userConverter」)的'@ ManagedBean'註解。我也刪除了正則表達式條件。我使用電子郵件作爲這個User的id,這就是我使用電子郵件的原因。問題現在已修復。非常感謝你。 – lv10

+0

BalusC - onie問題:我是JSF的新手,並且已經閱讀了@FacesConverter是必需的,並且想完全理解爲什麼我需要在這種情況下將其刪除。你能否擴展一下你的解釋,說明爲什麼我們爲這個轉換器去掉了它? - 提前致謝。 – lv10

+1

這是因爲你想在其中注入一個'@EJB'。然而'@ FacesConverter'(和'@ FacesValidator')不是支持的注入目標。這個疏忽在即將到來的JSF 2.2中得到解決。 – BalusC

相關問題