h:selectOneMenu重新显示页面后未从模型中读取值

时间:2012-04-24 20:21:39

标签: jsf-2 cdi

我偶然发现了一个奇怪的问题,我试图整天解决这个问题。我没有在下面的简单例子中重现它,但也许有人可以给我一些想法。

观看代码:

<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,这意味着应该重新显示相同的页面。但重新加载页面后,列表将再次重新初始化,并重置所选项目。我希望它能显示保存在模型中的所选项目。

0 个答案:

没有答案