如何从List创建Primefaces radioButtons?

时间:2012-10-29 20:21:01

标签: jsf-2 primefaces radio-button

我想从对象列表#{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 [严重性=(ERROR   2),summary =(转换错误设置值   'huhu.model.generated.Item@3ae5e1dc'for'null Converter'。),   detail =(转换错误设置值   'huhu.model.generated.Item@3ae5e1dc'for'null Converter'。)]

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

1 个答案:

答案 0 :(得分:2)

JSF生成HTML。 HTML基本上是一个大字符串。因此,非字符串类型的Java对象需要转换为字符串。如果遇到的类型没有找到内置转换器(NumberBooleanEnum),也没有找到自定义转换器(实现Converter的类),那么对象是默认toString()实现将用于将复杂的Java对象打印到HTML输出中。如果您的对象没有覆盖此方法,则Object#toString()中将描述Object的默认实现:

  

@的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符getClass().getName() + '@' + Integer.toHexString(hashCode()) 和散列的无符号十六进制表示形式组成对象的代码。换句话说,此方法返回一个等于值的字符串:

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

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

huhu.model.generated.Item@3ae5e1dc

(右键单击浏览器中的页面并选择“查看源”以自行查看)

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

您应该提供自定义转换器,以便在String及其唯一String表示之间正确转换。通常使用技术ID(例如来自数据库的自动生成的PK)作为唯一@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)); } } 表示。转换器将如下所示:

<f:selectItem(s)>

或者,您可以使用JSF实用程序库javadocSelectItemsConverter,以便转换器将使用<f:selectItem(s)>作为转换基础。这样,您就不需要为<p:selectOneRadio ... converter="omnifaces.SelectItemsConverter"> 中要使用的每个自定义Java类型创建自定义转换器。另请参阅OmniFaces

{{1}}