Что делать с внутренним преобразователем поддерживающего компонента с областью видимости

Еще одна проблема среди других проблем с поддержкой bean-компонентов с областью видимости в JSF. Я создал внутренний класс в моем компоненте поддержки с областью видимости. Этот внутренний класс является преобразователем. Мне нужен внутренний класс, потому что мне нужно получить доступ к некоторым полям из моего вспомогательного компонента (в данном случае список элементов select-one). Внезапно я понимаю, что метод @PostConstruct моего вспомогательного компонента вызывается после каждого запроса. После некоторого осмотра я понял, что проблема заключается в атрибуте конвертера, и после некоторого поиска в Google нашел (как всегда) блог BalusC причина этого.

Итак, мой вопрос: как заставить мой конвертер работать нормально, а также иметь список данных, необходимых для конвертации?


person partlov    schedule 11.01.2013    source источник


Ответы (1)


Выделите преобразователь в отдельный класс и используйте Application#evaluateExpressionGet() для доступа к экземпляру bean-компонента с областью видимости внутри метода преобразователя.

ViewBean viewBean = context.getApplication().evaluateExpressionGet(context, "#{viewBean}", ViewBean.class);

Это, однако, немного неприятный дизайн. Если я правильно понимаю ваше конкретное функциональное требование по преобразованию выбранного элемента на основе списка доступных элементов, альтернативой является использование универсального преобразователя, который преобразует на основе физических компонентов <f:selectItem>/<f:selectItems>. В служебной библиотеке JSF OmniFaces есть два конвертера именно для этой цели: SelectItemsConverter и SelectItemsIndexConverter.

person BalusC    schedule 11.01.2013
comment
Отлично, спасибо BalusC. В OmniFaces есть несколько дополнительных вещей, которые меня интересуют, и я думаю, что сейчас самое время начать их использовать. Я просто надеюсь, что это не вызовет у меня других побочных эффектов. - person partlov; 11.01.2013
comment
Пожалуйста. Насколько я вижу, начиная с версии 1.3 это не должно вызывать никаких побочных эффектов. - person BalusC; 11.01.2013
comment
Для меня это общая проблема. Я избегал преобразователей, потому что им всегда нужен доступ к коллекциям, которые находятся в моем поддерживающем компоненте. Вместо этого я использовал идентификаторы (`value=#{mybean.objectId}) с методами получения и установки идентификаторов. BalusC, вероятно, отшлепает меня за это, и он должен, потому что это приводит к другим уродливым проблемам, в основном выполняя преобразование в геттерах и сеттерах. Но более изящной альтернативы я не вижу. - person snakedog; 17.05.2018