valueChangeListener вызывается, когда начальное значение является пустой строкой, а новое значение равно null

Я столкнулся со странной проблемой с компонентом h: selectOneMenu.

Я использую h: selectOneMenu в своем приложении JSF 2. Я создал Arraylist месяцев в своем классе контроллера, который передается в h: selectOneMenu. Начальным элементом раскрывающегося списка является «Любой», значение которого представляет собой пустую строку. Значение h:selectOneMenu привязано к переменной класса объекта «месяц». Переменная месяц инициализируется как «» (пустая строка).

Я создал ValueChangeEvent на h: selectOneMenu. Я написал метод changeMonth (событие) в контроллере, который вызывается при событии изменения значения.

Моя проблема заключается в том, что это событие изменения значения запускается, когда я нажимаю кнопку отправки, даже если значение не изменяется. Это происходит только в том случае, если в раскрывающемся списке установлено значение «Любой». Когда я попытался получить значения для изменения в методе changeMonth, я получил старое значение как «» (пустая строка), а новое значение — как null.

В идеале ValueChangeEvent не должен запускаться. Но так как он меняется с пустого на нулевой, это происходит. Почему это происходит? Это проблема с компонентом JSF 2 h: selectOneMenu?

Я вставляю свой код контроллера:

@ManagedBean
@SessionScoped
public class Controller {

private List monthList;
private ObjClass searchVO;

public List getMonthList() {
    List<SelectItem> list = new ArrayList<SelectItem>();
    list.add(new SelectItem("", "Any"));

    for (int i = 1; i <= 12; i++) {
        list.add(new SelectItem(String.valueOf(i), "Month"+i));
    }
    monthList = list;
    return monthList;
}

/**
 * @param monthList
 *            the monthList to set
 */
public void setMonthList(List monthList) {

    this.monthList = monthList;
}
public ObjClass getSearchVO() {
    if (searchVO == null) {
        searchVO = new ObjClass();
    }
    return searchVO;
}

public void setSearchVO(ObjClass searchVO) {
    this.searchVO = searchVO;
}

public void changeMonth(ValueChangeEvent changeEvent) {

    PhaseId phaseId = changeEvent.getPhaseId();
    String oldValue = (String) changeEvent.getOldValue();
    String newValue = (String) changeEvent.getNewValue();

}

}

Это мой класс объектов:

public class ObjClass {
public String getMonth() {
    return month;
}

public void setMonth(String month) {
    this.month = month;
}

private String month="";

public ObjClass(String month) {
    super();
    this.month = month;
}
public ObjClass() {
}

}

И это моя форма xhtml:

<h:form>


    Dropdown example:

    <h:selectOneMenu valueChangeListener="#{controller.changeMonth}"
                onchange="submit();" id="month"
                value="#{controller.searchVO.month}" title="Select Month">
                <f:selectItems value="#{controller.monthList}" />
    </h:selectOneMenu>

        <br /><br />

  <h:outputText value="#{controller.searchVO.month}"></h:outputText>
            <h:commandButton value="Submit" action="result" />
        <h:commandButton value="Reset" type="reset" />

    </h:form>

person Stacklin    schedule 06.02.2015    source источник


Ответы (1)


Вместо добавления SelectItem("", "Any") в список попробуйте заменить его на:

list.add(new SelectItem(null, "Any", null, false, true, true));

Суть в том, чтобы использовать атрибут noSelectionOption объекта SelectItem (последний аргумент в конструкторе, для которого мы назначили true), который указывает, что это параметр "без выбора", дополнительную информацию об этом атрибуте можно найти в Javadoc SelectItem:

Флаг, указывающий, представляет ли параметр, созданный этим компонентом, специальный параметр «без выбора». Выражения должны оцениваться как логическое значение. Значение по умолчанию — ложь.

Что касается конструктора SelectItem, использованного выше, это описание предоставлено Javadocs:

Выбрать элемент

public SelectItem(java.lang.Object value,
                  java.lang.String label,
                  java.lang.String description,
                  boolean disabled,
                  boolean escape,
                  boolean noSelectionOption)

Создайте экземпляр SelectItem с указанными значениями свойств.

Параметры:

value - Value to be delivered to the model if this item is selected by the user
label - Label to be rendered for this item in the response
description - Description of this item, for use in tools
disabled - Flag indicating that this option is disabled
escape - Flag indicating that the text of this option should be escaped when rendered.
noSelectionOption - Flag indicating that the current option is a "no selection" option
person Tarik    schedule 06.02.2015
comment
Привет Тарик, это тоже не работает. Не могли бы вы воспроизвести точный код на вашем языке и сказать мне, какие результаты вы наблюдаете? - person Stacklin; 09.02.2015
comment
Хорошо, я попробую сегодня позже - person Tarik; 09.02.2015