尝试从应用程序的表中删除或编辑用户时,出现转换错误。该值正在从 listUser.xhmtl
的元数据中传递到 deleteUser.xhtml
页。该值正在元数据中传递,但由于某种原因,在调用删除操作时,我得到了 Conversion Error setting value "someemail@somedomain.com" for 'null Converter'
.用户 ID 是一个字符串。
这是请求 userDelete.xhmtl 后的 URL:
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();
}
最佳答案
null converter
在异常消息中表示找不到转换器实例。由于您通过 converter="#{userConverter}
将转换器引用为托管 bean ,只有用 @javax.faces.bean.ManagedBean
注释才能找到它如果类位于 WAR 中(因此不在 EJB/EAR 或其他地方!)。@FacesConverter
这个结构中没有使用注解,实际上是多余的——只会让初学者感到困惑。删除该注释。 @EJB
确实只适用于托管 bean。
如果真的无效(但我无法解释原因),请尝试通过 CDI 管理它:替换 JSF @ManagedBean
CDI 注释 @Named
注解。您显然已经通过 CDI 成功地管理了前端 Controller bean。
无关 对于具体问题,转换器似乎旨在基于技术 ID(数据库主键)而不是电子邮件地址进行转换。电子邮件地址永远无法匹配 \d+
(这是“仅限数字”的正则表达式)。确保您没有将电子邮件地址与 ID 混淆。
关于jsf - 转换错误设置值 "UserID"为 'null Converter',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13335295/