【问题标题】:Inject @SessionScoped CDI Bean to @Stateless EJB将@SessionScoped CDI Bean 注入@Stateless EJB
【发布时间】:2013-11-10 15:03:55
【问题描述】:

我想将 sessionscoped CDI bean 注入到无状态 EJB 中。在 EJB 访问时,应使用 sessionscoped cdi bean 的正确实例(即调用者的 sessionscope 中的那个)。我知道我可以用有状态的 EJB 解决这个问题,但是我真的很想知道这是否也可以用 CDI 解决。由于 EJB 和 Servlet 在同一场战争中运行,我假设它们共享同一个线程,并且容器应该能够在 EJB 中找出正确的 sessionscoped bean?

例如:

EJB:

@Stateless
@LocalBean
public class StatelessSessionBean {

    @Inject    
    Instance<SessionData> sessionData;    

    public String testMethod() {
        SessionData bean = sessionData.get();
        String result = "Retrieved bean " + bean + " with UUID "+ bean.uuid + ". Created on: " + new SimpleDateFormat("dd.MM.yyyy HH:mm").format(bean.creationDate);
        return result;
    }
}

CDI 豆:

@SessionScoped
public class SessionData implements Serializable {      

    String uuid;
    Date creationDate;

    public SessionData() {
        uuid = UUID.randomUUID().toString();
        creationDate = new Date();
    }    
}

当我现在访问无状态 EJB 时,例如从一个 servlet,我希望 testMethod 使用与调用者的 HTTPSession 关联的 CDI bean。因此,如果来自不同浏览器/http 会话的两个客户端访问 Servlet,它们都应该得到不同的结果字符串。

我是否需要 CDI Provider 而不是 Instance,如果需要,如何为给定会话生成正确的 bean 实例? 我考虑过获取 BeanManager 并搜索 SessionData 的实例,但我不知道如何获得正确的实例。

非常感谢任何帮助,谢谢!

【问题讨论】:

  • 您在尝试代码时没有说出发生了什么。
  • 您使用的是什么应用服务器或 CDI 实现?我建议添加一个标签。
  • @bkail 我正在使用 glasfish 4 并且 afaik 这是焊接...我添加了标签
  • @JBNizet 我必须更具体一点:我得到一个不同的引用,但总是使用相同的 UUID 和相同的创建日期......所以我认为代理不同但使用的对象是一样的

标签: jakarta-ee ejb cdi glassfish-4 weld


【解决方案1】:

好吧,现在我觉得有点愚蠢:-(

我通过不使用 getter/setter 来绕过代理提供的上下文 bean 进行成员访问。相反,我直接使用了包私有字段,这会阻止代理提供正确的实例。

当我切换到 getter/setter 后,它就开始按预期工作了。

【讨论】:

  • 那么,当我们将@SessionScoped cdi bean 注入到@Stateless EJB bean 时,@Stateless EJB bean 不会混合,如果我们用getter 访问它们,会混淆session-self 参数吗?跨度>
【解决方案2】:

感谢client proxies,将长期存在的 bean 范围注入短期的(包括 EJB 的依赖范围)开箱即用。

另请参阅Weld reference manual 中的相应部分。

【讨论】:

  • 不幸的是我无法确认这一点......如果我只使用@Inject(没有 Instance)并从不同的会话(即浏览器)访问它,我会得到不同的代理参考,但是bean 实例保持不变(它具有相同的创建日期和相同的 UUID)
猜你喜欢
  • 2013-06-30
  • 1970-01-01
  • 2011-03-31
  • 2016-08-02
  • 2019-08-04
  • 2023-01-26
  • 1970-01-01
  • 2015-02-12
相关资源
最近更新 更多