@PostConstruct не вызывался JSF, если ManagedBean находится внутри библиотеки jar

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

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

Ну, даже если я поставлю faces-config.xml внутри JAR/META-INF/ the @ManagedBean и @ViewScoped не работали. Я не мог понять, почему, но если я зарегистрирую бобы в faces-config.xml (JAR, а не военные) эта проблема уходит.

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

кто сталкивался это?

мое окружение: Glassfish 3.1.1 (сборка 12) В JSF 2.1.3

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

2 ответов


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

есть несколько причин этой проблемы:

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

  2. код есть . Этот конфликты 1-го требования, как указано в спецификация для JSF 2.0:

    11.5.1 требования к сканированию классов для аннотаций

    • если <faces-config> в элементе содержит metadata-complete атрибут, значение которого “true”, реализация не должна выполнять сканирование аннотаций для любых классов, кроме тех классов, которые предоставлены самой реализацией. В противном случае продолжайте как следует.

    • если среда выполнения обнаруживает конфликт между записью в ресурсах конфигурации приложения и аннотацией, запись в ресурсах конфигурации приложения имеет приоритет.

    • все классы WEB-INF/classes необходимо отсканировать.

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

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

  4. ваш webapp /WEB-INF/faces-config.xml и / или ваша банка /META-INF/faces-config.xml не является JSF 2.X совместимые. Он не должен содержать JSF 1.х конкретных <faces-config> декларация, но JSF 2.х конкретных один.

    <?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.