JSF 2: проблема noSelectionOption для selectOneMenu с конвертером - PullRequest
3 голосов
/ 29 декабря 2010

В настоящее время я тестирую использование тега 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();
    }
}

Ответы [ 2 ]

10 голосов
/ 29 декабря 2010

Один из них должен работать:

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

<f:selectItem itemValue="#{null}" itemLabel="Choose one .." 
        noSelectionOption="true"/>
3 голосов
/ 05 января 2011

Я заметил, что если вы используете атрибут @FacesConverter forClass вместо атрибута value, то noSelectionOption игнорируется (getAsString не вызывается для noSelectionOption)!Это несоответствие выглядит как ошибка, но стоит упомянуть.

Другими словами используйте:

@FacesConverter(forClass= HeroBean.class)

вместо

@FacesConverter("heroConverter")

(с converter = "heroConverter"атрибут selectOneMenu)

По крайней мере, это то, что я наблюдал при использовании Mojarra 2.0.2 на GlassFish 3.0.1.Очевидно, что в некоторых ситуациях вы не хотите, чтобы все объекты использовали один конвертер, поэтому в этом случае это не очень хорошая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...