1

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

@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 呈现正常,但是当我选择项目时,它们作为字符串而不是对象返回。

如果我将转换器注释更改为

@FacesConverter(value = "groupConverter")

并将我的 SelectManyMenu 标记更改为包括

converter="groupConverter"

然后它按预期工作。

这是 JSF/Primefaces 中的错误吗?

我正在使用:Primefaces 3.5 Tomcat 7

谢谢

4

1 回答 1

2

当后面的类型#{maintainMB.filteredLogicalGroups}是泛型集合(例如List<Group>)而不是普通数组(例如Group[].

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

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

private Group[] filteredLogicalGroups;

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

于 2013-11-28T17:57:39.983 回答