Jsf 2 如何从列表中创建Primefaces单选按钮?

Jsf 2 如何从列表中创建Primefaces单选按钮?,jsf-2,primefaces,radio-button,Jsf 2,Primefaces,Radio Button,我想从对象列表{item.items3}创建一组单选按钮,并将所选对象存储到{cartBean.selectedChoice}中。现在我没有真正得到和所需的值之间的差异。我的代码看起来怎么样。到目前为止有什么明显的错误吗 <p:selectOneRadio id="myRadio" value="#{cartBean.selectedChoice}" layout="custom"> <f:selectItems value="#{item.items3}"/>

我想从对象列表
{item.items3}
创建一组单选按钮,并将所选对象存储到
{cartBean.selectedChoice}
中。现在我没有真正得到
所需的值之间的差异。我的代码看起来怎么样。到目前为止有什么明显的错误吗

<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>

#{choice.name}
目前,我得到以下错误:

20:58:52397信息 [javax.enterprise.resource.webcontainer.jsf.renderkit] (http-localhost-127.0.0.1-8080-1)警告:已发送FacesMessage 已排队,但可能尚未显示。 sourceId=IterateCategorities:0:iterateItems:2:lightForm:myRadio[严重性=(错误) 2) ,summary=(转换错误设置值 'huhu.model.generated。Item@3ae5e1dc'对于“空转换器”。), 详细信息=(转换错误设置值 'huhu.model.generated。Item@3ae5e1dc'用于“空转换器”。)]


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

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

对象
的toString方法返回一个字符串,该字符串由对象作为实例的类的名称、at符号字符
@
和对象哈希代码的无符号十六进制表示形式组成。换句话说,此方法返回一个等于以下值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())
在您的特定情况下,生成的HTML单选按钮元素如下所示:

<input type="radio" ... value="huhu.model.generated.Item@3ae5e1dc" />
或者,您可以使用JSF实用程序库的,这样转换器将使用
作为转换基础。这样,您就不需要为希望在
中使用的每个自定义Java类型创建自定义转换器。另见:



感谢您的详细回答,提供了您自己设置转换器所需的信息。由于我不确定,我可能还需要转换哪些Java类型,因此我选择了omnifaces替代方案来处理转换问题。我仍然没有得到的是
的值之间的差异。
是必要的吗?
是必要的,因为您使用了
layout=“custom”
(基本上是指定您希望自己呈现每个项目并为其设置样式,而不是依赖默认的呈现)。如果您删除了
layout=“custom”
,那么确实没有必要这样做。这绝对是有道理的。但是从哪里可以获得
itemIndex
-属性的值呢?
@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));
    }
    
}
<p:selectOneRadio ... converter="omnifaces.SelectItemsConverter">