复合组件和带有(ENUM)转换器的SelectOneMenu

时间:2012-12-22 14:17:24

标签: jsf-2 primefaces composite-component

我正在尝试使用selectOneMenu创建一个简单的复合组件... 这很简单:

<cc:implementation>
    <h:panelGrid columns="2">
        <p:outputLabel for="#{cc.attrs.fieldId}" value="#{cc.attrs.fieldLabel}"/>
        <p:selectOneMenu id="#{cc.attrs.fieldId}" required="#{cc.attrs.required}" converter="#{cc.attrs.converter}" value="#{cc.attrs.targetValue}">
                <f:selectItem itemLabel="#{msg['label.selecione.item']}" itemValue="" />
                <f:selectItems value="#{cc.attrs.listValue}"/>
        </p:selectOneMenu>
    </h:panelGrid>          
</cc:implementation>

所以,问题是我试图通过转换器!这是一个ENUM转换器(使用@FacesConverter(value =“tipoCampoConverter”)注释扩展EnumConverter)

错误是:javax.el.E​​LException:无法将类java.lang.String类型的tipoCampoConverter转换为接口javax.faces.convert.Converter

**编辑:

一些额外信息:

我尝试使用和不使用'type'来声明属性:

    <cc:attribute name="converter" required="true" type="javax.faces.convert.Converter"/>

更多信息: 信息:启动Servlet引擎:Apache Tomcat / 7.0.12 信息:初始化Mojarra 2.1.10 信息:在PrimeFaces 3.4.2上运行 信息:在PrimeFaces Extensions 0.6.1上运行

:)

1 个答案:

答案 0 :(得分:6)

当值为converter时,Converter属性默认需要ValueExpression个实例。这样的事情<h:inputText converter="#{bean.converter}">。不幸的是,复合材料中这种不直观的行为是“按设计”的。

最好的办法是改为使用<f:converter>

<p:selectOneMenu ...>
    ...
    <f:converter converterId="#{cc.attrs.converter}" />
</p:selectOneMenu>

对于具体问题

无关根本不需要针对此特定用例的转换器。 JSF已经有一个内置的枚举转换器。如果您将UISelectMany组件绑定到List<E>而不是E[],则只需要此转换器。

另见: