В настоящее время я тестирую использование тега f: selectItems , который использует существующие классы POJO.
Работает нормально:
facelet:
<h:selectOneMenu value="#{selectionLabBean.oneSelectMenuPojo}"
converter="heroConverter">
<f:selectItems value="#{selectionLabBean.heroList}"
var="hero" itemValue="#{hero}" itemLabel="#{hero.name}" />
</h:selectOneMenu>
управляемый компонент:
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();
}
}