使用@Inject和@PostPersist方法的NullPointerException

时间:2015-12-06 14:31:33

标签: jpa dependency-injection java-ee-6 glassfish-4 stateless-session-bean

实体持久化后,我想执行一个Bean,它将注册邮件发送给新注册的用户。我想用Listener类来做这件事。我做了以下事情:

  1. 使用@EntityListener(UserListener.class)
  2. 注释实体
  3. 创建了监听器,并使用@Stateless
  4. 对其进行了注释

    以下是监听器的代码: (system.out.println部分仅用于测试目的)

    @Stateless
    public class UserListener {
    
        @Inject
        private MailSenderController mailSenderController;
    
        @PostPersist
        void onPostPersist(User user) throws AddressException{
           System.out.println("PostPersist");
           System.out.println("Username: " + user.getUsername());
           mailSenderController.sendRegistrationMail(user);
       }
    }
    

    MailSenderController是@RequestScoped带注释的Bean。

    如果我执行代码,我会得到NullPointerException。 如果我删除mailSenderController.sendRegistrationMail(user),则代码可以正常工作。

    我认为onPostPersist会在注入MailSenderController之前执行,这会导致NullPointerException

    有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我猜测MailSenderController不是您的用户注册入口点的入口点。如果是,则MailSenderController始终为NULL。考虑到MailSenderController具有请求范围,DI框架将仅实例化处理HTTP请求以发送邮件的控制器。

从设计的角度来看,直接从DAO层类调用控制器并不好。我认为您需要创建一个新的托管bean(单实例)MailSenderService,然后注入新服务而不是访问请求范围的控制器。

答案 1 :(得分:0)

只需将@Named注释添加到MailSenderController

即可