在Filter和ManagedBean中获取EJB的相同实例

时间:2012-09-11 10:17:21

标签: java-ee ejb-3.0 servlet-filters managed-bean stateful-session-bean

我正在尝试将过滤器添加到我的Java EE应用程序中,但我遇到了一些问题。

我想使用过滤器进行登录,因此我需要让它与管理登录的 UserManager bean“对话”。

这是我的结构:

  • LoginFilter:ServletFilter
  • LoginBean: SessionScoped Managed Bean
  • UserManager:有状态会话Bean
LoginFilter LoginBean 必须访问

UserManager ,因为它具有处理登录过程的方法。

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 添加到请求atrributes,但它会抛出一个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 个答案:

答案 0 :(得分:1)

不会返回新实例。即使您多次在过滤器中进行查找,它也会返回不同的实例。

您需要维护/使用在filter中创建的UserManagerLocal实例,而不是在LoginBean中注入UserManagerLocal,从请求中获取相同的实例。