5

我想将 sessionscoped CDI bean 注入到无状态 EJB 中。在访问 EJB 时,应该使用会话范围的 cdi bean 的正确实例(即调用者的会话范围中的那个)。我知道我可以用有状态的 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();
    }    
}

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

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

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

4

2 回答 2

5

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

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

一旦我切换到 getter/setter,它就开始按预期工作。

于 2013-11-14T11:12:24.317 回答
0

多亏了客户端代理,将长期存在的 bean 作用域注入到短期存在的作用域(包括 EJB 的 Dependent 作用域)中可以开箱即用。

另请参见焊接参考手册中的相应部分。

于 2013-11-12T21:18:42.580 回答