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

Mar*_*nha 2 primefaces composite-component jsf-2

我正在尝试使用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>
Run Code Online (Sandbox Code Playgroud)

所以,问题是我试图通过转换器!这是一个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"/>
Run Code Online (Sandbox Code Playgroud)

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

:)

Bal*_*usC 6

converter默认情况下,该属性Converter值为a时的实例ValueExpression.像这样的东西<h:inputText converter="#{bean.converter}">.不幸的是,这种在复合材料中不直观的行为"按设计".

你最好的选择是使用<f:converter>.

<p:selectOneMenu ...>
    ...
    <f:converter converterId="#{cc.attrs.converter}" />
</p:selectOneMenu>
Run Code Online (Sandbox Code Playgroud)

无关的具体问题,你就不会需要一个转换器,这个特定用例的.JSF已经有一个内置的枚举转换器.如果要将UISelectMany组件绑定到a List<E>而不是,则只需要此转换器E[].

也可以看看: