2

После того, как сущность сохраняется, я хочу выполнить бит, который отправляет регистрационную почту новому зарегистрированному пользователю. Я хочу сделать это с помощью класса Listener. Я сделал следующее:NullPointerException с помощью метода @Inject и @PostPersist

  1. Аннотированным Субъект с @EntityListener (UserListener.class)
  2. создал слушатель и аннотированный его @Stateless

Вот код слушателя: (система .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 аннотированный боб.

Если я выполняю код, я получаю NullPointerException. Если я удалю mailSenderController.sendRegistrationMail(user), код будет работать нормально.

Я думаю, что onPostPersist будет выполнен до ввода MailSenderController, и это вызывает NullPointerException.

Может кто-нибудь помочь мне с этой проблемой?

ответ

0

просто добавить @Named аннотации MailSenderController

+0

MailSenderController аннотируется с помощью Named и RequestScoped. Не упоминал об этом в вопросе. Моя вина. – Rallenaldo

1

Я предполагаю, что MailSenderController не точка входа пользовательской точки входа регистрации. Если да, то MailSenderController всегда будет NULL. Учитывая, что область MailSenderController имеет область запроса, инфраструктура DI только создаст экземпляр контроллера, обрабатывающего HTTP-запрос для отправки почты.

С точки зрения дизайна его плохо использовать для вызова контроллера непосредственно из классов уровня DAO. Я думаю, вам нужно создать новый управляемый компонент (один экземпляр) MailSenderService, а затем ввести новую услугу вместо доступа к контроллеру с ограниченным запросом.

+0

MailSenderController не является точкой входа для процесса регистрации. Это UserListController, который является SessionScoped. Как я читал в книге Java EE, я должен делегировать разные контроллеры и запускать Событие, если я хочу что-то упорствовать. Служебный компонент без состояния не делает этого в конце. Я искал в Интернете больше проблем, подобных моим, и я узнал, что у Glassfish есть проблемы с Injection Dependency in Bean. Возможно, это проблема. У EclipseLink есть исправление. До сих пор Haven't нашел исправление для Hibernate. – Rallenaldo

 Смежные вопросы

  • Нет связанных вопросов^_^