为什么没有调用 PostConstruct?

2022-09-01 07:22:43

我正在开发一个简单的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 调用了此方法。直到这里没有问题。但是由于没有调用初始化方法,因此我在em.persist中获得了NPE。

为什么未调用初始化方法?我在Glassfish服务器上运行这个。

问候。


答案 1

Java EE Bean 注释(如)仅适用于容器管理的 Bean。如果您只是调用自己,则容器不会拦截创建并调用该方法。@PostConstructnew BlogEntryDao@PostConstruct

(此外,最好使用 或 代替手动获取 方法中的 ,并且应该为每个调用 创建一个 ,因为它们是短暂的。进行这些更改将完全消除对@PersistenceContext@PersistenceUnitEntityManagerFactoryinitialize()EntityManageraddNewEntry()initialize()


答案 2

我在应用程序中遇到了同样的问题。你没有发布你的bean上下文配置xml文件(所以我不确定它是否是同样的问题),但在我的情况下添加这行:

<context:annotation-config/>

解决了我的问题。您需要或启用@PostConstruct批注。<context:annotation-config/><context:component-scan/>


推荐