1

我想从对象列表中创建一组单选按钮#{item.items3}并将所选对象存储到#{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(s) 已入队,但可能尚未显示。sourceId=iterateCategories:0:iterateItems:2:lightForm:myRadio[severity=(ERROR 2), summary=(转换错误设置值 'huhu.model.generated.Item@3ae5e1dc' for 'null Converter'.), detail=( 'null Converter'的转换错误设置值'huhu.model.generated.Item@3ae5e1dc'。)]

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

4

1 回答 1

2

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

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

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

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

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

(在浏览器中右键单击页面并选择查看源代码自己查看)

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

您确实应该提供一个自定义转换器,该转换器可以在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));
    }
    
}

或者,您可以使用SelectItemsConverterJSF 实用程序库OmniFaces,以便转换器将改为使用<f:selectItem(s)>作为转换基础。这样您就不需要为您想在<f:selectItem(s)>. 另请SelectItemsConverter参阅展示页面

<p:selectOneRadio ... converter="omnifaces.SelectItemsConverter">
于 2012-10-29T21:07:46.677 回答