我目前正在测试使用现有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();
}
}
答案 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观察到的。显然在某些情况下你不希望所有实体都使用一个转换器,因此在这种情况下这不是一个好主意。