Аннотация @PostConstruct к Weblogic 10.3.4 не вызывается

(Это похоже на дубликат https://stackoverflow.com/questions/5862085/weblogic10-3-ignores-postconsturt-method, но в нем мало деталей и на него нет ответа).

У меня есть ManagedBean следующим образом:

public class TestBean {
    private String greeting = "Hello, World!";

    public TestBean() {
    }

    public String getGreeting() {
      System.out.println( "getGreeting called, returning " + this.greeting );
      return greeting;
}

public void setGreeting( String message ) {
      this.greeting = message;
}


    @PostConstruct
    public void prepareSomething() {
        System.out.println( "\n\nPostConstruct called.\n\n" );
        this.greeting += " (PostConstruct was called)";
    }
}

и в моем xhtml у меня просто Bean Message: #{TestBean.greeting}. Однако при доступе к странице метод не вызывается, и я получаю

Bean Message: Hello, World!

вместо ожидаемого

Bean Message: Hello, World! (PostConstruct was called)

Консоль отображает sysout из метода getGreeting(), но не из prepareSomething():

INFO: Added Library from: zip:/data/java/wl1034/user_projects/domains/wlrep1034/autodeploy/PCTest.ear/PCTest.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jstl-fn.taglib.xml
getGreeting called, returning Hello, World!
2011-05-12 10:36:11,720 DEBUG org.richfaces.skin.SkinFactoryImpl - Create new Skin instance for name DEFAULT 

Дополнительная информация: я использую JSF 1.2 (используя банки из Weblogic 10.3.4 MW_HOME/common/deployable-libs/jsf-1.2.war!/WEB-INF/lib), Facelets 1.1.14, RichFaces 3.3.2. У меня есть следующие банки на WEB-INF/lib:

commons-beanutils-1.7.0.jar
commons-digester-1.8.jar
commons-logging-1.1.1.jar
glassfish.jsf_1.0.0.0_1-2-15.jar
glassfish.jstl_1.2.0.1.jar
javax.jsf_1.1.0.0_1-2.jar
jsf-facelets.jar
log4j-1.2.16.jar
richfaces-api-3.3.2.SR1.jar
richfaces-impl-3.3.2.SR1.jar
richfaces-ui-3.3.2.SR1.jar
SimpleJSF.jar
wls.jsf.di.jar

Я также пробовал размещать/удалять annotations-api.jar, те же симптомы.

При необходимости могу выложить другие файлы.


person st.never    schedule 12.05.2011    source источник
comment
На самом деле у меня настроен log4j, но другие сообщения sysout отображаются как обычно. Обновлю вопрос.   -  person st.never    schedule 12.05.2011


Ответы (2)


Я не использую Weblogic, но, если я не ошибаюсь, Weblogic уже поставляется со своими собственными библиотеками JSTL/JSF. Таким образом, вам не нужно поставлять их самостоятельно.

Но если я ошибаюсь и Weblogic не поставляется с ними, то эти библиотеки выглядят не совсем правильно. Какие именно версии?

glassfish.jsf_1.0.0.0_1-2-15.jar
glassfish.jstl_1.2.0.1.jar
javax.jsf_1.1.0.0_1-2.jar

@PostConstruct работает только с JSF 1.2 или новее. Вы можете скачать JSF 1.2 здесь. Он существует из двух файлов JAR

jsf-api.jar
jsf-impl.jar

Вам нужно только убедиться, что ваш faces-config.xml объявлен в соответствии со спецификацией JSF 1.2, а также что web.xml объявлен в соответствии как минимум со спецификацией Servlet 2.5.

Наконец, библиотека JSTL должна быть этой.

person BalusC    schedule 12.05.2011
comment
Привет @BalusC, Weblogic поставляется со своими собственными библиотеками; упомянутые вами банки были извлечены из него (согласно моему другой вопрос). Использование официальных файлов jsf-api.jar и jsf-impl.jar вызвало проблемы с Weblogic ELResolver; и полное их отсутствие вызвало ClassNotFoundExceptions. Единственный способ, которым мне удалось заставить его (частично) работать, - это использовать эти банки из самого Weblogic. - person st.never; 12.05.2011

Отвечая на мой собственный вопрос еще раз... Кажется, что, хотя вы можете встроить библиотеки Weblogic JSF в свое собственное приложение (это желательно для нашей компании, потому что мы разрабатываем продукт, который должен иметь небольшое влияние на установку для нескольких клиентов), внедрение зависимостей и публикация Механизмы -construct работают только в том случае, если вы действительно развертываете библиотеку и ссылаетесь на нее.

Мне помог этот сайт: http://blog.eisele.net/2009/02/jsf-versions-and-weblogic-server.html

Короче говоря, мне пришлось развернуть Weblogic JSF war как библиотеку, удалить ее jar-файлы из моего собственного приложения (также удалено annotations-api) и добавить следующее в мое WEB-INF/weblogic.xml:

<library-ref>
  <library-name>jsf</library-name>
  <specification-version>1.2</specification-version>
  <implementation-version>1.2</implementation-version>
  <exact-match>false</exact-match>
</library-ref>

Мне также пришлось переписать пару bean-компонентов, которые использовали @PostConstruct более одного раза. Это работает в Websphere, Jetty и Tomcat, но Weblogic явно запрещает использовать его более одного раза:

http://download.oracle.com/docs/cd/E12840_01/wls/docs103/programming/annotate_dependency.html

person st.never    schedule 13.05.2011