Значение SelectOneMenu, установленное в ноль при перезагрузке - PullRequest
0 голосов
/ 04 сентября 2018

Я получил элемент управления SelectOneMenu, добавленный в форму с помощью тега include, который обновляет свойство bean-компонента через ajax, проблема в том, что когда страница обновляется, свойство по какой-то причине имеет значение null, я подозреваю, что нужно что-то делать с жизненным циклом, но я не уверен, как подойти к этой проблеме.

это репо имеет упрощенную версию, которая повторяет поведение

главная страница

<html xmlns...>
    <h:body>
        <h1>Select one</h1>
        <h:form>
            <ui:include src="#{country.page}" />
        </h:form>
    </h:body>
</html>

первая страница: просто ссылка, которая ведет на страницу, которая добавляет элемент управления и устанавливает значение по умолчанию

<div xmlns=...>
    <h:commandLink action="#{country.goTo2}">go to 2</h:commandLink>
</div>

вторая страница: когда страница обновляется, находясь здесь, свойство имеет значение null

<div xmlns= ...>
    <h:panelGrid columns="2">           
        Select a country:  
        <h:selectOneMenu value="#{country.localeCode}" valueChangeListener="#{country.countryLocaleCodeChanged}">
            <f:selectItem itemLabel="it is null" itemValue="#{null}" />
            <f:selectItems value="#{country.countryInMap}" />
            <f:ajax execute="@form"/>
        </h:selectOneMenu>
        <h:commandLink action="#{country.goTo1}">go back to 1</h:commandLink>
    </h:panelGrid>
</div>

Это боб

@ManagedBean(name="country")
@SessionScoped
public class CountryBean implements Serializable{

    private static Map<String,String> countries;

    private String localeCode = "en"; //default value 

    private String page = "page1.xhtml";

    static{
        countries = new LinkedHashMap<String,String>();
        countries.put("United Kingdom", "en"); //label, value
        countries.put("French", "fr");
        countries.put("German", "de");
        countries.put("China", "zh_CN");
    }

    public void countryLocaleCodeChanged(ValueChangeEvent e){
        System.out.println("value changed :" + e.getNewValue());
    }

    public Map<String,String> getCountryInMap() {
        return CountryBean.countries;
    }

    //setters and getters here

    public void goTo2() {
        this.localeCode = "de";
        this.page = "page2.xhtml";
    }

    public void goTo1() {
        this.page = "page1.xhtml";
    }
}
...