0

私は奇妙な問題に出くわし、一日中解決しようとしました。以下の些細な例ではそれを再現できませんでしたが、誰かが私にいくつかのアイデアを与えることができるかもしれません.

ビューコード:

<h:selectOneMenu id="color"
  value="#{testModel.color}" required="true"
  converter="#{colorConverter}">
    <f:selectItems id="colorList"
      value="#{testModel.colorList}"
      var="colorVar" itemLabel="#{colorVar.name}" itemValue="#{colorVar}"/>
</h:selectOneMenu>

セッション スコープ モデル:

@javax.inject.Named
@javax.enterprise.context.SessionScoped
public class TestModel implements Serializable {
    private Color color;
    //color getters and setters

    private static final List<Color> colorList;

    static {
      // in real example I initialize this list from database
      colorList = new ArrayList<Color>();
      colorList.add(Color.getRedColor());
      colorList.add(Color.getGreenColor());
      colorList.add(Color.getBlueColor());
    }

    public List<Color> getColorList() {
      return colorList;
    }

    public String save() {
      //doing some stuff
      // stay on the same page
      return null;
    }
}

カラーコンバーター:

@Named
@ApplicationScoped
public class ColorConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        return value != null ? Color.valueOf(value) : null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        if (value instanceof Color) {
            return ((Color) value).getName();
        }
        return null;
    }
}

この簡単な例は問題なく動作します。しかし実際には、ColorオブジェクトはDTOドメイン オブジェクトからマップされた です。カラーリストを一度だけ初期化し、そのアイテムをコンバーターで使用してColorConverter#getAsObject、colorList からアイテムを返すようにしました。

というわけで、問題はこれです。フェーズ中Update Modelに、選択したアイテムが正しく変換され、モデルに設定されます。次に、Invoke Applicationフェーズ中TestModel#saveに null を返すメソッドが呼び出されます。これは、同じページを再表示する必要があることを意味します。ただし、ページがリロードされた後、リストは再び初期化され、選択されたアイテムはリセットされます。モデルに保存された選択項目が表示されることを期待しています。

4

0 に答える 0