2

I´m trying to create a simple composite component with a selectOneMenu... It is really simple:

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

So, the problem is when I´m trying to pass the converter! That is an ENUM converter (extends EnumConverter with @FacesConverter(value = "tipoCampoConverter") annotation)

The error is: javax.el.ELException: Cannot convert tipoCampoConverter of type class java.lang.String to interface javax.faces.convert.Converter

**EDIT:

Some extra info:

I tried to declare the attribute with and without the 'type':

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

Some more info: INFO: Starting Servlet Engine: Apache Tomcat/7.0.12 INFO: Initializing Mojarra 2.1.10 INFO: Running on PrimeFaces 3.4.2 INFO: Running on PrimeFaces Extensions 0.6.1

:)

Marco Noronha
  • 115
  • 1
  • 9
  • 31

1 Answers1

7

The converter attribute expects by default a Converter instance when the value is a ValueExpression. Something like this <h:inputText converter="#{bean.converter}">. This unintuitive behaviour in composites is unfortunately "by design".

Your best bet is to use <f:converter> instead.

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

Unrelated to the concrete problem, you do not need a converter for this particular use case at all. JSF has already a builtin enum converter. You only need this converter if you're binding an UISelectMany component to a List<E> instead of E[].

See also:

Community
  • 1
  • 1
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555