如何使用自定义 JSF 转换器将 h:selectOneMenu 项转换为 List<String>?

Posted

技术标签:

【中文标题】如何使用自定义 JSF 转换器将 h:selectOneMenu 项转换为 List<String>?【英文标题】:How to convert h:selectOneMenu item to a List<String> with custom JSF converter? 【发布时间】:2016-10-12 17:13:53 【问题描述】:

在注册页面上,我希望用户只能选择一个角色。因此我使用&lt;h:selectOneMenu

    <h:selectOneMenu id="roles" value="#register.user.roles"  required="true">
    <f:selectItem itemValue="EMPLOYEE" itemLabel="EMPLOYEE" />
    <f:selectItem itemValue="MANAGER" itemLabel="MANAGER" />
    </h:selectOneMenu> 

&lt;h:selectOneMenu 返回String 对象。但是,为了将其持久化到数据库中,我需要获取 List&lt;String&gt; 。这是我使用的转换器

@FacesConverter(value="aConverter")
public class AConverter implements Converter 

    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2)
            throws ConverterException  
        List<String> result = null; 
        result.add(arg1.toString()); 
        return result;
    

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2)
            throws ConverterException 
        return arg1.toString(); 
    

我应该如何将 &lt;h:selectOneMenu return String 转换为 List ? 我得到NullPointerException

【问题讨论】:

1:使用arg2,它是值,而不是arg1,它是选择组件。 2:List&lt;String&gt; result = null;是空指针异常的原因。尝试类似new ArrayList&lt;String&gt;() 而不是 null。 所有组合是什么意思?如果你将一个列表初始化为 null 然后在下一行添加到它,你显然会得到一个空指针异常。 【参考方案1】:

&lt;h:selectOneMenu id="roles" value="#register.user.roles" required="true"&gt; 在这里,您将值存储在字符串中。相反,在您的 managedBean 中创建一个变量作为 ArrayList 并在您的 JSP 页面中使用它来保存 selectOneMenu 的值。我认为它应该可以工作,你不需要转换器。

【讨论】:

以上是关于如何使用自定义 JSF 转换器将 h:selectOneMenu 项转换为 List<String>?的主要内容,如果未能解决你的问题,请参考以下文章

如何将现有的 JSF 组件添加到我自己的自定义组件中?

通用 JSF 实体转换器 [重复]

jsf 2.0 自定义组件/标签不复合

如何在 JSF 中执行验证,如何在 JSF 中创建自定义验证器

JSF 为组件声明定义自定义命名空间

如何在 JSF 2.0 中创建自定义 404 消息?