JAXB булева обработка на странности и JSF

Има известен бъг в JAXB: https://jaxb.dev.java.net/issues/show_bug.cgi?id=733

JAXB не генерира правилно средства за получаване и настройка на булево поле, тази грешка е оставена некоригирана за обратна съвместимост.

Съществува плъгин JAXB и ще гарантира, че се генерират следните гетери и сетери за булеви полета:

  1. генерира се setXXX(булева стойност).
  2. getXXX() is generated
    • If the boolean attribute specifies default value in the XSD, then getXXX() returns boolean,
    • Ако булевият атрибут не указва по подразбиране в XSD, тогава getXXX() връща Boolean.

Проблем: опитът за редактиране/преглед на полето XXX в JSF компонент (като квадратче за отметка) не работи - компонентът е деактивиран.

Използвам Apache Trinidad 1.2. Компонентът е кодиран, както следва:

<tr:selectBooleanCheckbox value="#{MvsDatasetUI.object.mvsDataset.temporary}" id="temporary" converter="javax.faces.Boolean" />

Не съм проследил това в дълбочина, но предположението (подкрепено от заобиколното решение по-долу) е, че JSF EL резолверът (или каквото знаете) търси булев метод getXXX() и тъй като не го намира, компонентът е деактивиран.

Заобиколно решение: Ако променя метода getXXX(), за да връща булево значение, тогава всичко върви.

Въпроси:

  • What are your ideas on how to address this problem en-masse in the fastest way possible?
    • Have I missed some customization for the boolean-getter JAXB plugin?
  • Възможно ли е (има ли смисъл) да се промени JSF резолвер (или whathaveyou), така че ако Boolean getXXX() не бъде намерен, той да се върне към boolean getXXX()?

Бих предпочел да не се намесвам ръчно и да променям всички генерирани методи getXXX(), така че да връщат Boolean вместо boolean.


person finrod    schedule 10.06.2010    source източник


Отговори (1)


Проблем: опитът за редактиране/преглед на полето XXX в JSF компонент (като квадратче за отметка) не работи - компонентът е деактивиран.

Работил съм с JSF от векове, но никога не съм виждал този конкретен проблем в JSF. Технически също е невъзможно даден компонент да бъде деактивиран въз основа на типа на неговата стойност. По-скоро би хвърлил PropertyNotFoundException или ConverterException, когато свойството не може да бъде намерено или типът стойност е неконвертируем.

Направих бърз тест с <h:selectBooleanCheckbox value="#{bean.checked}" /> и следните гетери:

  • public boolean isChecked() работи добре.
  • public boolean getChecked() работи добре.
  • public Boolean isChecked() хвърля PropertyNotFoundException по време на изобразяване (правилно).
  • public Boolean getChecked() работи добре.

Въз основа на тази информация бих проучил отново проблема и бих прегледал заключенията. Не използвате ли някакъв автоматично генериран или JSF код на трета страна, който не сте написали сами? Проверихте ли JSF кода внимателно? Не е ли просто използването на това свойство в някакъв атрибут disabled? Boolean има стойност по подразбиране null, докато boolean по подразбиране е false. И null, и false се държат различно в EL.

person BalusC    schedule 10.06.2010
comment
Благодаря, това са много добри (и освежаващи :)) точки. Ще проуча отново. Ние използваме Apache Trinidad. Свойството се използва в атрибут стойност и използва конвертор: javax.faces.Boolean. Само за да имате 100% ясна картина тук - всичките ви бързи тестове се правят със сетер: setChecked(булева стойност)? - person finrod; 10.06.2010
comment
Да, въпреки че всъщност няма значение, тъй като настройката е от значение само когато изпращате формуляра. - person BalusC; 10.06.2010
comment
Все още не успях да проуча отново това в дълбочина. Ще актуализирам този въпрос, след като го направя. Благодаря ви, че споделихте своя опит. - person finrod; 13.06.2010