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 は正常にレンダリングされますが、アイテムを選択すると、オブジェクトではなく文字列として返されます。

Converter アノテーションを

@FacesConverter(value = "groupConverter")

私のSelectManyMenuタグを変更して含めるようにします

converter="groupConverter"

その後、期待どおりに動作します。

これは JSF/Primefaces のバグですか?

使用しています: Primefaces 3.5 Tomcat 7

ありがとう

4

1 に答える 1

2

背後の型が などの単純な配列ではなく#{maintainMB.filteredLogicalGroups}、 などのジェネリック コレクションである場合、コンバーターは失敗します。List<Group>Group[]

理由は簡単です。ジェネリック型情報はコンパイル時にのみ存在し、実行時には完全に存在しません。EL/反射はコンパイル時に実行されませんが、実行時にのみ実行されるため、表示されるのはList. Stringコンバーターがないと、HTTP 要求パラメーターと同じように、デフォルトのタイプのアイテムを保持すると見なされます。

を利用したい場合は、プロパティをプロパティforClassに変更する必要があります。List<Group>Group[]

private Group[] filteredLogicalGroups;

それ以外の場合は、コンバーターを明示的に指定する必要があります。

于 2013-11-28T17:57:39.983 に答える