h:selectOneMenu с логическими элементами не работает с нулевым значением

Я работаю с JSF 2.0, JBoss 7.1.1 Final и имею следующую проблему с selectOneMenu. Я хочу иметь возможность установить для поля в управляемом бине значение true/false/null. Таким образом, я создал следующее selectOneMenu:

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" >
    <f:selectItem itemValue="#{null}" itemLabel="Any.." />
    <f:selectItem itemValue="true" itemLabel="Yes"/>
    <f:selectItem itemValue="false" itemLabel="No"/>
</h:selectOneMenu>

Теперь, если я выберу "Any..", он назначит "false" для поля registrationComplete (которое является логическим). Так что ноль интерпретируется как ложный. Я также попытался использовать логические значения в selectItem(s), то есть:

 <h:selectOneMenu value="#{personList.criteria.registrationComplete}" >
    <f:selectItem itemValue="#{null}" itemLabel="Any.." />
    <f:selectItem itemValue="#{true}" itemLabel="Yes"/>
    <f:selectItem itemValue="#{false}" itemLabel="No"/>
</h:selectOneMenu>

И я также зарегистрировал конвертер в face-config следующим образом:

<converter>  
    <converter-id>booleanConverter</converter-id>  
    <converter-class>javax.faces.convert.BooleanConverter</converter-class>  
</converter>

и попытался использовать это:

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" >
    <f:selectItem itemValue="#{null}" itemLabel="Any.." />
    <f:selectItem itemValue="true" itemLabel="Yes"/>
    <f:selectItem itemValue="false" itemLabel="No"/>
        <f:converter converterId="booleanConverter"/>
</h:selectOneMenu>

Но все эти попытки привели к тому же самому поведению - когда было выбрано нулевое значение, оно интерпретировалось как ложное.

Я отладил его и в трассировке стека нашел место, где это происходит. В AstValue.setValue(EvaluationContext, Object) line: 204

это вызывает

ELSupport.coerceToType(value, targetClass)

значение параметра равно нулю, а targetClass - логический. Этот метод coerceToType затем возвращает false.

Есть идеи, как решить эту проблему? Спасибо!

1 ответ

Решение

Это типично для парсера Apache EL, который используется Tomcat и JBoss. Известно, что при принуждении не проводится различие между примитивами и представлениями объектов-оболочек. null значения в EL. Типы обертки всегда рассматриваются как примитивы. Он отлично работает в Glassfish, например.

Вы можете отключить это поведение анализатора Apache EL, добавив следующий аргумент VM в скрипт запуска вашего сервера:

-Dorg.apache.el.parser.COERCE_TO_ZERO=false
Другие вопросы по тегам