我正在尝试使用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.ELException:无法将类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上运行
:)
答案 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[]
,则只需要此转换器。
GenericEnumConverter
- UISelectMany
List<E>
的可重复使用解决方案1>