我想从对象列表#{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'。)]
我不明白,可能存在转换问题,因为只处理同一类的对象。
答案 0 :(得分:2)
JSF生成HTML。 HTML基本上是一个大字符串。因此,非字符串类型的Java对象需要转换为字符串。如果遇到的类型没有找到内置转换器(Number
,Boolean
和Enum
),也没有找到自定义转换器(实现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实用程序库javadoc的SelectItemsConverter
,以便转换器将使用<f:selectItem(s)>
作为转换基础。这样,您就不需要为<p:selectOneRadio ... converter="omnifaces.SelectItemsConverter">
中要使用的每个自定义Java类型创建自定义转换器。另请参阅OmniFaces:
{{1}}