jsf - 转换错误设置值 "UserID"为 'null Converter'

标签 jsf jakarta-ee metadata javabeans converter

尝试从应用程序的表中删除或编辑用户时,出现转换错误。该值正在从 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/

相关文章:

jsf - XML 解析错误 : no element found Location: http://localhost:8081/web-app/pages/login. xhtml 第 1 行,第 1 列:^

css - Java Web 应用级联样式表 : where do I put them?

hibernate - 是否可以使@Formula注释延迟加载?

amazon-web-services - AWS S3 复制/粘贴不复制元数据

eclipse - Ubuntu 崩溃,Eclipse 丢失 .metadata,Java Perspective 消失,丢失,丢失

html - &lt;!DOCTYPE> 部分在 JSF 中应该如何显示? HTML5 还是 XHTML?

java - 从操作属性中随机调用 Bean 方法

android - 问题 78326 : AAPT prints sRGB profile warnings messages

java - Hibernate IDENTITY 与 SEQUENCE 实体标识符生成器

java - 中断 servlet 过滤器工作