@PostConstruct не вызывается JSF, если ManagedBean находится внутри библиотеки jar
Я бегу со следующей проблемой.
У меня есть несколько управляемых бобов, которые в данный момент совместно используются двумя приложениями JSF. Поскольку я не хочу копировать и вставлять код в два (больше в ближайшем будущем), я поместил эти общие управляемые бобы в библиотеку JAR. Я следил за этим блогом: http://jsflive.wordpress.com/2011/03/24/custom-component-library/
Ну даже если я поставлю фейс-конфиг.xml внутри JAR/META-INF/ @ManagedBean и @ViewScoped ничего не вышло. Я не мог понять почему, но если я зарегистрирую бобы в faces-config.xml (JAR-те, а не военные) эта проблема уходит.
Я мог бы жить с этим,но к моему удивлению аннотацию @PostConstruct не вызвали для этого управляемого Боба внутри библиотеки JAR. Я не получаю никаких ошибок, предупреждений или чего-то еще. Я предполагаю, что бобы загружаются, но их аннотации не обрабатываются.
Кто-нибудь сталкивался с этим?
Мое окружение: В GlassFish 3.1.1 (сборка 12) JSF 2.1.3
Заранее благодарю.
2 ответа:
Тогда аннотация
@PostConstruct
не была отсканирована. Это результат той же самой проблемы, которая привела к тому, что ваши@ManagedBean
аннотации и лайки не были отсканированы.Существует несколько причин возникновения этой проблемы:
Вы использовали Mojarra 2.1.0 на Jetty / Tomcat/JBoss AS. Это очень специфическая ошибка в сканере аннотаций. См. выпуск 1937 года .
Ваш файл
/WEB-INF/faces-config.xml
имеет атрибутmetadata-complete="true"
. Это противоречит 1-му требованию, изложенному в спецификация JSF 2.0 :11.5.1 требования к сканированию классов для аннотаций
Если элемент
<faces-config>
в файлеWEB-INF/faces-config.xml
содержит атрибутmetadata-complete
, значение которого равно“true”
, реализация не должна выполнять проверку аннотаций на любых классах, кроме тех классов, которые предоставлены самой реализацией. В противном случае продолжайте следующим образом.Если среда выполнения обнаруживает конфликт между записью в приложении Ресурсы конфигурации и аннотации, запись в ресурсах конфигурации приложения имеет приоритет.
Все классы в
WEB-INF/classes
должны быть отсканированы.Для каждого jar в каталоге приложения
WEB-INF/lib
, если jar содержит“META-INF/faces-config.xml”
файл или файл, который соответствует регулярному выражению“.*\.faces-config.xml”
(даже пустому), все классы в этом jar должны быть проверены.Ваш файл JAR не был удален
/WEB-INF/lib
, но где-то еще на пути к классу. Это противоречит 4-му требованию, изложенному выше.Ваш webapp
/WEB-INF/faces-config.xml
и/или ваш JAR/META-INF/faces-config.xml
не является JSF 2.X совместим. Он не должен содержать JSF 1.X специфическое<faces-config>
объявление, но JSF 2.X конкретный.<?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0"> </faces-config>
Тот, что в банке
/META-INF
, должен быть полностью пуст.Причина 1 может быть поцарапана в вашем конкретном случае, когда вы используете Mojarra 2.1.3 на Glassfish. Держу пари, что так оно и будет. другая причина.
Также обратите внимание, что метод post-construct не должен быть объявлен для создания любого проверяемого исключения. Сообщение от
stderr
:Method 'public void my.app.MyBean.postConstruct() throws java.lang.Exception' marked with the 'javax.annotation.PostConstruct' annotation cannot declare any checked exceptions. This method will be ignored.