如何从List创建Primefaces radioButtons?

我想从对象列表#{item.items3}创建一组Radiobuttons,并将选定的对象存储到#{cartBean.selectedChoice} 。 现在我并没有真正区分<f:selectItems><ui:repeat>所需的值。 我的代码看起来如何。 迄今为止的任何明显错误?

<p:selectOneRadio id="myRadio" value="#{cartBean.selectedChoice}" layout="custom">
    <f:selectItems value="#{item.items3}"/>
</p:selectOneRadio>

<h:panelGrid columns="1">
    <ui:repeat var="choice" value="#{item.items3}" varStatus="choiceIndex">
        <p:radioButton id="choiceRadio" for=":iterateCategories:iterateItems:lightForm:myRadio" itemIndex="#{choiceIndex.index}" />#{choice.name}
    </ui:repeat>
</h:panelGrid>

此刻我收到以下错误:

20:58:52,397 INFO [javax.enterprise.resource.webcontainer.jsf.renderkit](http-localhost-127.0.0.1-8080-1)警告:FacesMessage已被入队,但可能未被显示。 sourceId = iterateCategories:0:iterateItems:2:lightForm:myRadio [severity =(ERROR 2),summary =('null Converter'的转换错误设置值'huhu.model.generated.Item@3ae5e1dc'。),detail =( 'null Converter'的转换错误设置值'huhu.model.generated.Item@3ae5e1dc'。)]

我不明白,在哪里可能存在转换问题,因为只处理同一类别的对象。


JSF生成HTML。 HTML基本上是一个大字符串。 因此,非字符串类型的Java对象需要转换为字符串。 如果遇到没有内建转换器( NumberBooleanEnum )或自定义转换器(实现Converter的类)的类型,则会使用该对象的默认toString()实现将复杂的Java对象打印到HTML输出。 如果你的对象没有重写这个方法,那么它将是javadoc中描述的Object#toString()的默认实现:

Object的toString方法返回一个字符串,其中包含对象为实例的类的名称,符号字符@和对象的哈希代码的无符号十六进制表示形式。 换句话说,这个方法返回一个字符串,其值等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

在您的具体情况下,生成的HTML单选按钮元素变为以下内容:

<input type="radio" ... value="huhu.model.generated.Item@3ae5e1dc" />

(右键单击浏览器中的页面,然后选择查看源代码以查看它自己)

现在,当这个表单被提交时,由request.getParameter() (它返回String !)收集的输入值huhu.model.generated.Item@3ae5e1dc必须被转换回你的自定义类型Item的具体实例。 但是,由于显然没有为自定义类型注册转换器(错误消息已经提示:“null转换器”),因此JSF无法将其转换回Item并会抛出此转换器异常。

你应该提供一个自定义的转换器,它可以正确地在Item和它的唯一String表示之间进行转换。 常常使用技术ID(例如数据库中自动生成的PK)作为唯一的String表示形式。 转换器将如下所示:

@FacesConverter(forClass=Item.class)
public class ItemConverter implements Converter {

    @Override
    public void getAsString(FacesContext context, UIComponent component, Object modelValue) throws ConverterException {
        // Write code to convert Item to its unique String representation. E.g.
        return String.valueOf(((Item) modelValue).getId());
    }

    @Override 
    public void getAsObject(FacesContext context, UIComponent component, Object submittedValue) throws ConverterException {
        // Write code to convert unique String representation of Item to concrete Item. E.g.
        return someItemService.find(Long.valueOf(submittedValue));
    }

}

或者,您可以使用JSF实用程序库OmniFaces的SelectItemsConverter ,以便转换器将使用<f:selectItem(s)>作为转换基础。 通过这种方式,您无需为每个要在<f:selectItem(s)>使用的自定义Java类型创建自定义转换器。 另请参阅SelectItemsConverter展示页面:

<p:selectOneRadio ... converter="omnifaces.SelectItemsConverter">
链接地址: http://www.djcxy.com/p/71657.html

上一篇: How to create Primefaces radioButtons from List?

下一篇: How do I write and configure a custom facelet to override h:messages?