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