Получение одного и того же экземпляра EJB как в Filter, так и в ManagedBean

Я пытаюсь добавить фильтр в свое приложение Java EE, но сталкиваюсь с некоторыми проблемами.

Я хочу использовать фильтр для входа в систему, поэтому мне нужно позволить ему "общаться" с компонентом UserManager, который управляет входом в систему.

Вот моя структура:

  • LoginFilter: ServletFilter
  • LoginBean: управляемый компонент SessionScoped
  • UserManager: компонент сеанса с сохранением состояния

UserManager должен быть доступен как LoginFilter, так и LoginBean, потому что у него есть методы для обработки процесса входа в систему.

Находясь в LoginBean, я получаю UserManager с этой простой строкой:

@EJB private UserManagerLocal userManager;

Я не могу сделать это в LoginFilter, поэтому мне пришлось написать метод поиска:

try{
    Context c = new InitialContext();
    return (UserManagerLocal) c.lookup("java:global/PROJECT/PROJECT-ejb/UserManager!ejb.UserManagerLocal");
} catch (NamingException ex) {
    ...
}

У меня также была строка для добавления этого UserManagerLocal к атрибутам запроса, но он выбрасывает NPE, потому что при вызове метода lookup нет запроса, поэтому я переместил его в метод doFilter().

public void doFilter(...){
   HttpServletRequest req = (HttpServletRequest) request;
   if(req.getAttribute("userManager") == null){
      req.setAttribute("userManager", userManager);
   }
   ...
}

Теперь приходит проблема.

LoginFilter и LoginBean используют два разных экземпляра UserManager! Это заставляет мой фильтр останавливать даже зарегистрированных пользователей, потому что LoginBean работает на другом экземпляре UserManager, и поэтому LoginFilter не знает, что вход был выполнен!

Как я могу это исправить? Я думал, что поиск и инъекция вернут один и тот же экземпляр SSFB!

1 ответ

Нет, это вернет новый экземпляр. Даже если вы выполните поиск в фильтре несколько раз, он вернет разные экземпляры.

Вам нужно сохранить / использовать экземпляр UserManagerLocal, который вы создали в фильтре, вместо внедрения UserManagerLocal в LoginBean получить тот же экземпляр из запроса.

Другие вопросы по тегам