Jsf 转换错误设置值“;用户ID“;对于';空转换器';
尝试从应用程序中的表中删除或编辑用户时,我遇到转换错误。元数据中的值正在从Jsf 转换错误设置值“;用户ID“;对于';空转换器';,jsf,jakarta-ee,metadata,javabeans,converter,Jsf,Jakarta Ee,Metadata,Javabeans,Converter,尝试从应用程序中的表中删除或编辑用户时,我遇到转换错误。元数据中的值正在从listUser.xhtml传递到deleteUser.xhtml页面。该值正在元数据中传递,但由于某种原因,在调用删除操作时,我得到了转换错误设置值”someemail@somedomain.com对于“空转换器”。用户id是一个字符串 这是请求userDelete.xhtml后的url: http://localhost:8080/lavpWebApp/user/deleteUser.xhtml?user=someem
listUser.xhtml
传递到deleteUser.xhtml
页面。该值正在元数据中传递,但由于某种原因,在调用删除操作时,我得到了转换错误设置值”someemail@somedomain.com对于“空转换器”
。用户id是一个字符串
这是请求userDelete.xhtml后的url:
http://localhost:8080/lavpWebApp/user/deleteUser.xhtml?user=someemail%40somedomain.com
这是userList.xhtml简化版:
<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>
<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>
@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();
}
这是简化的userController类:
<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>
<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>
@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();
}
@Named
@请求范围
公共类用户控制器{
@EJB
私有用户sellerejb userEJB;
private UserSeller user=new UserSeller();
private List usersList=new ArrayList();
//-------------------------------------------------------------构造函数
公共用户控制器(){
}
//-------------------------------------------------------商业方法
公共字符串doCreateUser()
{
user=userEJB.createSeller(用户);
usersList=userEJB.findAllSellers();
返回“listUser?faces redirect=true”;
}
//更新用户
公共无效预渲染视图()
{
if(user==null)
{
user=newuserseller();
}
}
公共字符串doUpdateUser()
{
if(user.getEmail()!=null)
{
updateSeller(用户);
}
其他的
{
createSeller(用户);
}
返回“listUser?faces redirect=true”;
}
公共字符串deleteUser()
{
删除卖方(用户);
返回“listUser?faces redirect=true”;
}
公共字符串doCancelDeleteUser()
{
返回“listUser?faces redirect=true”;
}
@施工后
公共void init()
{
usersList=userEJB.findAllSellers();
}
异常消息中的null converter
表示找不到转换器实例。因为您正在通过converter=“#{userConverter}将转换器引用为托管bean
,只有使用@javax.faces.bean.ManagedBean对其进行注释,并且该类位于WAR中(因此不在EJB/EAR或其他地方!),才能找到它
@FacesConverter
注释未在该构造中使用,事实上是多余的,而且只会让初学者感到困惑。请删除该注释。@EJB
确实只在托管bean中工作
如果真的没有用(但是我无法解释为什么),那么试着用CDI来管理它:用CDI@ManagedBean
注释替换JSF@Named
注释。显然,您已经通过CDI成功地管理了前端控制器bean
与具体问题无关,转换器的设计似乎是基于技术ID(DB主键)而不是电子邮件地址进行转换。电子邮件地址永远无法匹配\d+
(这是“仅限数字”的正则表达式)。请确保您没有将电子邮件地址与ID混淆。尝试为@ManagedBean
注释分配名称
,并使用该名称访问转换器。确保它与您在@FacesConverter
中已使用的名称不同@ManagedBean
无法拥有@FacesConverter代码>注释。删除@ManagedBean
注释,代码就可以工作了。顺便说一句,您将JSF与CDI混合使用,最好研究两者及其差异。相关:。@kolossus谢谢。我已将名称添加到@ManagedBean
,我使用了@ManagedBean(name=“userSellerConverter”)
但它仍然给出了相同的错误。@LuiggiMendoza,这不准确。转换器也可以用@ManagedBean
注释。我知道,因为我已经做过几次了。这是转换器可以访问@Inject
类型资源的唯一方法。从技术上讲,Luiggi是正确的,一个@ManagedBean
不能有e一个@FacesConverter
注释。通常是一个或另一个,而不是两个。非常感谢您的详细建议。我按照您的指示,删除了@FacesConverter
注释,还替换了@ManagedBean
注释,用于@Named(“userConverter”)
。我还删除了regex条件。我将电子邮件用作此用户的id
,这就是我使用电子邮件的原因。问题现在已经解决。非常感谢。BalusC-onie问题:我是JSF新手,读到需要@FacesConverter,我想完全理解为什么在这种情况下需要删除它。你能告诉我吗结束一点关于为什么我们为这个转换器删除它的解释?-提前谢谢。那是因为你想在其中注入一个@EJB
。@FacesConverter
(和@FacesValidator
)不是一个受支持的注入目标。这个疏忽在即将发布的JSF 2.2中得到了修复。非常感谢,我现在就得到了它。