2015-12-29 2 views
1

В моем JSF pagecode, у меня есть что-то похожее на следующее:ч: selectOneRadio проходит нулевой символ вместо нулевого значения

<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> 

В моей pagecode бэк-боба, у меня есть что-то вроде следующего:

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 вместо нуля.

Есть ли способ сделать 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> 

ответ

1

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

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

public enum Choice { 
    Y, N; 
} 

private Choice attending; 

Или, вероятно, лучше, Boolean.

private Boolean attending; 

<f:selectItem itemValue="true" itemLabel="Yes" /> 
<f:selectItem itemValue="false" itemLabel="No" /> 
+0

Хотя я согласен, это, к сожалению, не то, что я могу легко изменить в этом проекте - пример кода я предоставил это упрощение. Характер, присутствующий на самом деле, не входит в основной класс Pagecode, но внутри другого объекта, который является свойством подкласса, и, к сожалению, этот класс является частью общей библиотеки, используемой несколькими другими проектами. Я бы хотел изменить его, но на данный момент я не могу. Даже ради любопытства, был ли способ сделать h: selectOneRadio отправить null вместо нулевого символа? Кажется, это странная реализация. – Chatoyancy

+1

Вина EL, а не JSF. Вы можете попробовать отключить COERCE_TO_ZERO. Связано: http://balusc.omnifaces.org/2015/10/the-empty-string-madness.html – BalusC

+0

Я только что проверил это с аргументом COERCE_TO_ZERO и могу проверить, исправил ли он это. Поведение связано с этой проблемой. Благодаря! – Chatoyancy

Смежные вопросы