Флажки JSF 2 и логические геттеры
Я создаю клиент Jaxws на основе веб-сервиса. Jaxb будет генерировать логические значения, используя java.lang.Boolean вместо примитивного типа. В дополнение к этому, он сгенерирует соглашение об именовании is() для bean-компонентов.
Однако, если я попытаюсь связать логическое значение (например, isOptional()) с флажком, оно выдаст следующее исключение:
value="#{property.optional}": Property 'optional' not readable on type java.lang.Boolean
Мои навыки работы с Google сообщили мне, что jsf отлично работает с:
boolean isOptional()
boolean getOptional()
Boolean getOptional()
Но не с
Boolean isOptional()
Однако невозможно обновить бины вручную из-за размера и количества веб-сервисов, поэтому есть ли способ заставить jsf правильно использовать java.lang.Boolean isOptional()? Или я могу как-то определить свойство в файле привязок jaxb во время генерации, которое волшебным образом генерирует "getOptional()"?
На sidenote работает следующее:
<h:selectBooleanCheckbox value="#{property.isOptional()}"/>
Однако я не могу обновить значение предположительно, потому что он не может найти установщик.
РЕДАКТИРОВАТЬ: я использую последнюю версию jdk 7, вывод "java -version":
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)
Вывод "wsimport -version":
JAX-WS RI 2.2.4-b01
Сгенерированный код:
public Boolean isOptional() {
return optional;
}
2 ответа
Jaxb будет генерировать логические значения, используя java.lang.Boolean вместо примитивного типа. В дополнение к этому, он сгенерирует соглашение об именовании is() для bean-компонентов.
С использованием is
префикс геттера для java.lang.Boolean
была известная крупная ошибка JAXB. Это было исправлено в версии 2.1.13, которая была выпущена уже в апреле 2010 года. Держите ваши библиотеки в актуальном состоянии.
Смотрите также эту статью в блоге для некоторого фона.
Великая ошибка API JAXB
15 сентября 2006 г.
Вы должны отдать его Сану за то, что он все испортил. Одно дело писать программное обеспечение, которое не соответствует спецификации, когда документация такая же толстая, как учебник. Взять, к примеру, почти все, что создано W3C. Тем не менее, это действительно плохо, когда вы не можете следовать своей собственной спецификации, особенно когда это самая известная ее часть. Правильно, Sun упустила на милю свою спецификацию, когда они создали JAXB 2.0 API. Компилятор JAXB 2.0 (XJC) неправильно использует префикс "is" вместо "get" при создании метода getter для свойства java.lang.Boolean. В то время как спецификация JavaBean утверждает, что методы чтения для примитивных логических значений могут использовать альтернативный префикс "is", эта гибкость не распространяется на его аналог булевой оболочки.
8.3.2 Булевы свойства
Кроме того, для логических свойств мы разрешаем методу getter соответствовать шаблону:
public boolean is();
Этот метод "is" может быть предоставлен вместо метода "get" или может быть предоставлен в дополнение к методу "get". В любом случае, если метод "is" присутствует для логического свойства, тогда мы будем использовать метод "is" для чтения значения свойства.
Пример логического свойства может быть:
public boolean isMarsupial(); public void setMarsupial(boolean m);
Учитывая, что JAXB является платформой генерации кода, и идея фреймворков генерации кода заключается в том, что код должен использоваться "как есть", а не изменяться после него, это довольно большое "упс". Хотя об этой проблеме уже сообщалось, Sun ответила: "Извините, уже слишком поздно".
Такое поведение регулируется спецификацией, и, к сожалению, сейчас уже слишком поздно менять спецификацию.
С точки зрения пользовательского опыта, благодаря авто-боксу, я не думаю, что это будет реальной проблемой для людей. Проблема в том, что вы используете Introspector и в нем отсутствует свойство? Поздно? Не реальная проблема? Оно сломано. ПОЧИНИ ЭТО! Мне также не нравится наивное утверждение, что оно, вероятно, не повлияет на фреймворки. Хм, да, будет, учитывая, что другие проекты действительно придерживались спецификации (hibernate, spring, myfaces и т. Д.)
ОБНОВЛЕНИЕ: Stevo Slavic сообщил мне, что это было исправлено в JAXB 2.1.13. Смотрите JAXB-131 для деталей. Да уж!
JSF / EL не виноват здесь. Он делает свою работу должным образом, соответствует спецификации JavaBean s.
Я не уверен, почему последняя и самая лучшая версия JAXB все еще генерирует неправильный метод, но я наконец исправил это, добавив "-B-enableIntrospection" (согласно http://jaxb.java.net/2.2.4/docs/xjc.html) на вызов wsimport. Это приводит к:
public Boolean getOptional() {
return optional;
}