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中得到了修复。非常感谢,我现在就得到了它。