@PostConstruct не вызывается JSF, если ManagedBean находится внутри библиотеки jar - PullRequest
6 голосов
/ 29 августа 2011

Я работаю со следующей проблемой.

У меня есть несколько управляемых бинов, которые на данный момент разделены между двумя приложениями JSF. Поскольку я не хочу копировать и вставлять код в два (больше в будущем), я поместил эти общие управляемые bean-компоненты в библиотеку JAR. Я подписался на этот блог: http://jsflive.wordpress.com/2011/03/24/custom-component-library/

Хорошо, даже если я поместил face-config.xml в JAR / META-INF /, @ManagedBean и @ViewScoped не сработали. Я не мог понять, почему, но если я зарегистрирую bean-компоненты в face-config.xml (JAR, а не WAR), эта проблема исчезнет.

Я мог бы с этим смириться, но к моему удивлению аннотация @PostConstruct не была вызвана для этих управляемых bean-компонентов внутри библиотеки JAR. Я не получаю никаких ошибок, предупреждений или чего-то еще. Я предполагаю, что бины загружаются, но их аннотации не обрабатываются.

Кто-нибудь сталкивался с этим?

Моя среда: Glassfish 3.1.1 (сборка 12) JSF 2.1.3

Заранее спасибо.

Ответы [ 2 ]

15 голосов
/ 29 августа 2011

Тогда аннотация @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 должны быть отсканированы.

    • Для каждой банки в каталоге WEB-INF/lib приложения, если банка содержит “META-INF/faces-config.xml” файл или файл, который соответствует регулярному выражению “.*\.faces-config.xml” (даже пустому), все классы в этом jar должны быть проверены.

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

  4. Ваше веб-приложение /WEB-INF/faces-config.xml и / или ваш JAR /META-INF/faces-config.xml не совместимо с JSF 2.x. Он не должен содержать объявление <faces-config>, специфичное для JSF 1.x, а объявление, специфичное для 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>
    

    Допускается, чтобы тот, который находится в JAR /META-INF, был полностью пустым.

Причина 1 может быть поцарапана в вашем конкретном случае, когда вы используете Mojarra 2.1.3 на Glassfish. Могу поспорить, что это другие причины.

8 голосов
/ 13 февраля 2013

Также обратите внимание, что метод 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.
...