@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 6

2 ответа:

Тогда аннотация @PostConstruct не была отсканирована. Это результат той же самой проблемы, которая привела к тому, что ваши @ManagedBean аннотации и лайки не были отсканированы.

Существует несколько причин возникновения этой проблемы:

  1. Вы использовали Mojarra 2.1.0 на Jetty / Tomcat/JBoss AS. Это очень специфическая ошибка в сканере аннотаций. См. выпуск 1937 года .

  2. Ваш файл /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 должны быть проверены.

  3. Ваш файл JAR не был удален /WEB-INF/lib, но где-то еще на пути к классу. Это противоречит 4-му требованию, изложенному выше.

  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.