私は奇妙な問題に出くわし、一日中解決しようとしました。以下の些細な例ではそれを再現できませんでしたが、誰かが私にいくつかのアイデアを与えることができるかもしれません.
ビューコード:
<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 を返すメソッドが呼び出されます。これは、同じページを再表示する必要があることを意味します。ただし、ページがリロードされた後、リストは再び初期化され、選択されたアイテムはリセットされます。モデルに保存された選択項目が表示されることを期待しています。