@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
аннотации и лайки не были отсканированы.
есть несколько причин этой проблемы:
вы использовали Mojarra 2.1.0 на причале / Tomcat / JBoss AS. Это очень специфическая ошибка в сканере аннотаций. См.выпуск 1937.
-
код есть . Этот конфликты 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”
(даже пустой), все классы в этой банке должны быть отсканированы.
ваш файл JAR не был удален в
/WEB-INF/lib
, но где-то еще в пути к классам. Это противоречит четвертому требованию, изложенному выше.-
ваш 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.