我想将 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 的实例,但我不知道如何获得正确的实例。
非常感谢任何帮助,谢谢!