私はシンプルな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サーバーでこれを実行しています。
よろしく。
この質問は "postconstruct not called"についてGoogleで最初に出てくるので、Spring Beanに_@PostConstruct
_を置く代わりにnew
キーワードを使用する以外に_@PostConstruct
_メソッドが呼び出されない別の理由循環依存関係がある場合です。
このBeanがこのBeanに依存する別のBeanに依存する場合、BlogEntryDaoはその別のBeanの依存関係ですが、BlogEntryDao
が初期化される前に他のBeanがaddNewEntry()
を呼び出すことがあります。
これは、循環参照のために、SpringがどのBeanを最初にロードしたいかを知らなかったためです。この場合、循環参照を削除するか、メンバー値またはセッターの代わりに_@AutoWired
_/_@Value
_コンストラクターパラメーターを使用できます。または、xml構成を使用する場合は、Beanが定義されている順序を入れ替えることができます。
アプリケーションにも同じ問題がありました。 Beanコンテキスト構成xmlファイルを投稿しなかったため(同じ問題かどうかはわかりません)、私の場合は次の行を追加します。
<context:annotation-config/>
私の問題を解決しました。 @PostConstructアノテーションを有効にするには、<context:annotation-config/>
または<context:component-scan/>
のいずれかが必要です。
私の場合、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.