嘗試從我的應用程序中的表中刪除或編輯用戶時,出現轉換錯誤。該值將從listUser.xhmtl
到deleteUser.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();
}
嘗試爲'@ ManagedBean'註釋分配一個'name'並使用它來訪問轉換器。確保它與'@ FacesConverter'中已經使用的不同# – kolossus
@ @ ManagedBean'不能具有'@ FacesConverter'註釋。刪除代碼將運行的'@ ManagedBean'註釋。順便說一句,你將JSF和CDI混合在一起,研究它們和它們的區別會更好。相關:[使用JEE6將EJB注入JSF轉換器](http://stackoverflow.com/q/2019495/1065197)。 –
@kolossus謝謝。我已經給'@ ManagedBean'添加了'name',我使用了@ManagedBean(name =「userSellerConverter」),但它仍然給出了相同的錯誤。 – lv10