实体持久化后,我想执行一个Bean,它将注册邮件发送给新注册的用户。我想用Listener类来做这件事。我做了以下事情:
@EntityListener
(UserListener.class)@Stateless
以下是监听器的代码: (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
。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
我猜测MailSenderController
不是您的用户注册入口点的入口点。如果是,则MailSenderController
始终为NULL。考虑到MailSenderController
具有请求范围,DI框架将仅实例化处理HTTP请求以发送邮件的控制器。
从设计的角度来看,直接从DAO层类调用控制器并不好。我认为您需要创建一个新的托管bean(单实例)MailSenderService
,然后注入新服务而不是访问请求范围的控制器。
答案 1 :(得分:0)
只需将@Named注释添加到MailSenderController
即可