web-dev-qa-db-ja.com

PostConstructが呼び出されないのはなぜですか?

私はシンプルなJava EEアプリケーションに取り組んでいます。

私はこのようなクラスがあります:

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

@Stateless
public class BlogEntryDao {

    EntityManager em;

    @PostConstruct
    public void initialize(){
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("Persistence");
        em = emf.createEntityManager();
    }

    public void addNewEntry(){
        Blogentry blogentry = new Blogentry();

        blogentry.setTitle("Test");
        blogentry.setContent("asdfasfas");

        em.persist(blogentry);

    }
}

したがって、私のマネージドBeanはこのメソッドを呼び出します。ここまで問題ありません。しかし、initializeメソッドが呼び出されないため、em.persistでNPEを取得しています。

初期化メソッドが呼び出されないのはなぜですか? Glassfishサーバーでこれを実行しています。

よろしく。

21
Koray Tugay

この質問は "postconstruct not called"についてGoogleで最初に出てくるので、Spring Beanに_@PostConstruct_を置く代わりにnewキーワードを使用する以外に_@PostConstruct_メソッドが呼び出されない別の理由循環依存関係がある場合です。

このBeanがこのBeanに依存する別のBeanに依存する場合、BlogEntryDaoはその別のBeanの依存関係ですが、BlogEntryDaoが初期化される前に他のBeanがaddNewEntry()を呼び出すことがあります。

これは、循環参照のために、SpringがどのBeanを最初にロードしたいかを知らなかったためです。この場合、循環参照を削除するか、メンバー値またはセッターの代わりに_@AutoWired_/_@Value_コンストラクターパラメーターを使用できます。または、xml構成を使用する場合は、Beanが定義されている順序を入れ替えることができます。

13

アプリケーションにも同じ問題がありました。 Beanコンテキスト構成xmlファイルを投稿しなかったため(同じ問題かどうかはわかりません)、私の場合は次の行を追加します。

<context:annotation-config/>

私の問題を解決しました。 @PostConstructアノテーションを有効にするには、<context:annotation-config/>または<context:component-scan/>のいずれかが必要です。

11
Tomasz Kubiak

私の場合、initialize()メソッドは静的であり、例外もスローするため、@ PostConstructは呼び出されませんでした。いずれの場合も、メソッドは無視されます。同じ間違いを犯した他の人の助けになることを願っています。これはコンソールで見つけることができます:

WARNING: JSF1044: Method '<XXX>' marked with the 'javax.annotation.PostConstruct' annotation cannot be static.  This method will be ignored.
WARNING: JSF1047: Method '<XXX>' marked with the 'javax.annotation.PostConstruct' annotation cannot declare any checked exceptions.  This method will be ignored.
2
divaylo