Primefaces SelectManyMenu转换器不转换

时间:2013-05-17 09:25:18

标签: jsf primefaces converter selectmanymenu

我在整个系统中使用转换器,它使用以下注释:

@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

由于

1 个答案:

答案 0 :(得分:1)

#{maintainMB.filteredLogicalGroups}后面的类型是通用集合(例如List<Group>)而不是普通数组(例如Group[])时,转换器将失败。

原因很简单:泛型类型信息仅在编译期间出现,在运行时期间完全不存在。 EL /反射在编译期间不运行,但仅在运行时期间运行,因此它看到的只是List。如果没有转换器,它会假定它保存默认类型String的项目,与HTTP请求参数相同。

如果您想使用forClass,则需要将List<Group>属性更改为Group[]属性。

private Group[] filteredLogicalGroups;

否则,您必须明确指定转换器。