JSF 2:带转换器的selectOneMenu的noSelectionOption问题

时间:2010-12-29 08:29:32

标签: jsf jsf-2

我目前正在测试使用现有POJO类的 f:selectItems 标记。

这很好用:

facelet:

<h:selectOneMenu value="#{selectionLabBean.oneSelectMenuPojo}" 
    converter="heroConverter">
    <f:selectItems value="#{selectionLabBean.heroList}" 
        var="hero" itemValue="#{hero}" itemLabel="#{hero.name}" />
</h:selectOneMenu>

托管bean:

private HeroBean oneSelectMenuPojo;
public HeroBean getOneSelectMenuPojo() {
    return oneSelectMenuPojo;
}
public void setOneSelectMenuPojo(HeroBean oneSelectMenuPojo) {
    this.oneSelectMenuPojo = oneSelectMenuPojo;
}

然后,我想添加“选择一个......”选项,我这样做了:

facelet:

<h:selectOneMenu value="#{selectionLabBean.oneSelectMenuPojo}" 
    converter="heroConverter">
    <f:selectItem itemValue="NONE" itemLabel="Choose one .." 
        noSelectionOption="true"/>
    <f:selectItems value="#{selectionLabBean.heroList}" 
        var="hero" itemValue="#{hero}" itemLabel="#{hero.name}" />
</h:selectOneMenu>

这将发生异常:

  

java.lang.ClassCastException:java.lang.String无法强制转换为user.ui.HeroBean

我想我理解这个问题。我使用转换器将POJO映射到选择,反之亦然,“选择一个”映射到字符串。但我也想把“选择一个......”的字符串。我该怎么做才能解决这个问题?

这是我的转换器类:

@FacesConverter("heroConverter")
public class HeroBeanConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext context, UIComponent ui, 
        String newValue) {
        return HeroBean.findHeroBeanByName(newValue);
    }

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

2 个答案:

答案 0 :(得分:10)

其中一项应该有效:

<f:selectItem itemLabel="Choose one .." 
        noSelectionOption="true"/>

<f:selectItem itemValue="#{null}" itemLabel="Choose one .." 
        noSelectionOption="true"/>

答案 1 :(得分:3)

我注意到如果使用@FacesConverter forClass属性而不是value属性,则忽略noSelectionOption(不为noSelectionOption调用getAsString)!这种不一致似乎是一个错误,但值得一提。

换句话说,使用:

@FacesConverter(forClass= HeroBean.class)

而不是

@FacesConverter("heroConverter")

(在selectOneMenu上使用converter =“heroConverter”属性)

至少这是我在GlassFish 3.0.1上使用Mojarra 2.0.2观察到的。显然在某些情况下你不希望所有实体都使用一个转换器,因此在这种情况下这不是一个好主意。