Получение одного и того же экземпляра 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 получить тот же экземпляр из запроса.