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