我在整个系统中使用转换器,它使用以下注释:
@FacesConverter(forClass = Group.class)
这个工作正常,但SelectManyMenu除外,转换似乎没有发生。我的SelectManyMenu定义如下
<p:selectManyMenu value="#{maintainMB.filteredLogicalGroups}" var="g" showCheckbox="true">
<f:selectItems value="#{maintainMB.logicalGroupFilterList}" var="group" itemLabel="#{group.name}" itemValue="#{group}" />
<p:column>
<p:graphicImage value="image.png.xhtml" width="32"/>
</p:column>
<p:column>
#{g.name}
</p:column>
</p:selectManyMenu>
SelectMenyMenu呈现正常,但是当我选择项目时,它们将作为字符串而不是对象返回。
如果我将Converter注释更改为
@FacesConverter(value = "groupConverter")
并将我的SelectManyMenu标记更改为包含
converter="groupConverter"
然后按预期工作。
这是JSF / Primefaces中的错误吗?
我正在使用: Primefaces 3.5 Tomcat 7
由于
答案 0 :(得分:1)
当#{maintainMB.filteredLogicalGroups}
后面的类型是通用集合(例如List<Group>
)而不是普通数组(例如Group[]
)时,转换器将失败。
原因很简单:泛型类型信息仅在编译期间出现,在运行时期间完全不存在。 EL /反射在编译期间不运行,但仅在运行时期间运行,因此它看到的只是List
。如果没有转换器,它会假定它保存默认类型String
的项目,与HTTP请求参数相同。
如果您想使用forClass
,则需要将List<Group>
属性更改为Group[]
属性。
private Group[] filteredLogicalGroups;
否则,您必须明确指定转换器。