MyControllerと呼ばれるセッションスコープのマネージドBeanがあります。MyModelと呼ばれるPOJOへの参照があります。MyModelには、次のようにap:orderlistにバインドする他のPOJOのArrayListが含まれています。
<p:orderList value="#{myController.myModel.list}" var="item" itemValue="#{item}" converter="#{itemConverter}"">
<f:facet name="caption">some title</f:facet>
<p:column>
#{item.text}
</p:column>
</p:orderList>
私のコンバーターは次のようになります。
@ManagedBean
@RequestScoped
public class ItemConverter implements Converter {
@ManagedProperty(value="#{myController.myModel.list}")
private List<Item> list;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Iterator i = list.iterator();
int id = Integer.parseInt(value);
while (i.hasNext()) {
Object currentObject = i.next();
if (((Item) currentObject).getId() == id) {
return currentObject;
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return Integer.toString(((Item) value).getId());
}
}
注文リストにアイテムを動的に追加するために、myControllerにインターフェイスとメソッドを構築しました。最初にアイテムを追加すると、正常に機能しているように見えます。リストが更新され、新しいアイテムが表示されます。ただし、2番目の項目を追加すると、リストを含むダイアログが消え、JavaScriptコンソールからshow()メソッドを呼び出しても表示できなくなります。デバッグにより、2番目のアイテムを追加すると、リストが宣言および定義されたときに、アイテムのArrayListではなくStringのArrayListになっていることがわかりました。これには、リストに追加した最初のアイテムのコンバーターのgetAsString()メソッドによって返される文字列が含まれています。当然、文字列のリストにアイテムを追加しようとしているため、2番目のアイテムの追加は失敗します。
これはどのように可能ですか?Javaでは、アイテムのリストを文字列のリストに置き換えることは決してできないと思いました。ソースリストを独自の文字列リストで上書きせずにorderlistを使用することも可能ですか?そもそもこれらの文字列をオブジェクトに変換するコンバーターの仕事ではありませんか?アイテムのリストからサーバー側でオーダーリストを作成し、バインディング属性と値の属性を使用して別の文字列のリストにマップすることは可能でしょうか?可能であれば、サーバー側でオーダーリストを作成するにはどうすればよいですか?
編集:getAsObject()でi.next()を二重に呼び出しても、文字列のリストを取得する問題を修正しました。また、コンバーターを手動でインスタンス化しようとすると、context.getApplication().evaluateExpressionGet(context, "#{itemConverter}", itemConverter.class);
nullが返されます。