h: selectOneRadio передает нулевой символ вместо нулевого значения

В моем коде страницы JSF у меня есть что-то похожее на следующее:

<h:selectOneRadio value="#{pagecode.attending}" required="true" id="attendingRadio" binding="#{attendingRadio}">
    <f:selectItem itemValue="Y" itemLabel="Yes"/>
    <f:selectItem itemValue="N" itemLabel="No"/>
    <f:ajax event="click" render="attendingDetails" execute="attendingRadio"/>
</h:selectOneRadio>
<h:panelGroup id="attendingDetails">
    <h:panelGroup rendered="#{pagecode.showForm(attendingRadio.value)}">
        ...
    </h:panelGroup>
</h:panelGroup>

В моем компоненте поддержки кода страницы у меня есть что-то вроде следующего:

public class Pagecode {
    protected Character attending;

    public Character getAttending() {
        return attending;
    }

    public void setAttending(Character attending) {    
        this.attending=attending;
    }

    public boolean showForm(Character c) {
        if (c==null) {
            return false;
        }
        (other stuff)...
    }

}

Ожидаемое поведение:

  1. Страница загружается. Переключатель не имеет начального значения, поэтому ни Да, ни Нет не выбраны. Однако, поскольку required="true", пользователь получит ошибку проверки, если оставит поле пустым (а так оно и есть).
  2. При первой загрузке страницы вызывается #{pagecode.showForm(attendingRadio.value)}, я ожидаю, что будет передан нулевой объект, а showForm вернет false.

После устранения некоторых неполадок я определил, что на самом деле происходит то, что вместо передачи нулевого объекта, т.е. эквивалентно showForm(null), вместо этого я получаю эквивалент showForm(new Character('\u0000')); вместо этого он передает символ Unicode для null.

Есть ли способ заставить JSF передавать нулевой объект Java вместо нулевого символа, когда в моем h: selectOneRadio не выбрано значение? Я использую Apache MyFaces JSF 2.0 на WebSphere Portal 8.0.

В качестве примечания я попытался добавить следующее в свой web.xml, и, к сожалению, это не помогло:

<context-param>
   <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
   <param-value>true</param-value>
</context-param>

person Chatoyancy    schedule 29.12.2015    source источник


Ответы (1)


Character/char — это просто неправильный тип данных для значения, которое вы хотите представить.

Вместо этого используйте enum.

public enum Choice {
    Y, N;
}

private Choice attending;

Or, likely better, a Boolean.

private Boolean attending;

<f:selectItem itemValue="true" itemLabel="Yes" />
<f:selectItem itemValue="false" itemLabel="No" />
person BalusC    schedule 29.12.2015
comment
Хотя я согласен, к сожалению, это не то, что я могу легко изменить в этом проекте - приведенный мной пример кода является упрощением. Посещающий персонаж на самом деле находится не в основном классе Pagecode, а в другом объекте, который является свойством подкласса, и, к сожалению, этот класс является частью общей библиотеки, используемой несколькими другими проектами. Я бы хотел изменить его, но пока не могу. Даже ради простого любопытства, есть ли способ заставить h:selectOneRadio отправлять нуль вместо нулевого символа? Кажется странной реализацией. - person Chatoyancy; 17.01.2016
comment
Вините EL, а не JSF. Вы можете попробовать отключить COERCE_TO_ZERO. Связано: balusc.omnifaces.org/2015/10/the- пустая строка-безумие.html - person BalusC; 17.01.2016
comment
Я только что проверил это с аргументом COERCE_TO_ZERO и могу убедиться, что это исправлено. Поведение связано с этой проблемой. Спасибо! - person Chatoyancy; 24.03.2016