Primefaces SelectManyMenu Converter не конвертируется
Я использую конвертер в моей системе, который использует следующую аннотацию:
@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
Спасибо
1 ответ
Преобразователь потерпит неудачу, когда тип позади #{maintainMB.filteredLogicalGroups}
является общей коллекцией, такой как List<Group>
вместо простого массива, такого как Group[]
,
Причина проста: информация общего типа присутствует только во время компиляции и полностью отсутствует во время выполнения. EL/reflections не запускается во время компиляции, а только во время выполнения, и все, что он видит, таким образом, является List
, Без конвертера предполагается, что он содержит элементы типа по умолчанию String
, так же, как параметры HTTP-запроса.
Если вы хотите использовать forClass
тогда вам нужно будет изменить List<Group>
собственность на Group[]
имущество.
private Group[] filteredLogicalGroups;
В противном случае вам действительно нужно явно указать конвертер.