将@SessionScoped CDI Bean注入@Stateless EJB

Kor*_*gen 5 ejb java-ee cdi weld glassfish-4

我想将一个sessioncoped CDI bean注入无状态EJB.在EJB的访问时,应该使用sessionscoped cdi bean的正确实例(即调用者的sessionscope中的那个).我知道我可以使用有状态EJB来解决这个问题,但是我真的想知道这是否可以用CDI解决.由于EJB和Servlet在同一个战争中运行,我假设它们共享相同的线程,容器应该能够在EJB中找出正确的sessioncoped 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

CDI Bean:

@SessionScoped
public class SessionData implements Serializable {      

    String uuid;
    Date creationDate;

    public SessionData() {
        uuid = UUID.randomUUID().toString();
        creationDate = new Date();
    }    
}
Run Code Online (Sandbox Code Playgroud)

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

我是否需要CDI Provider而不是,Instance如果是,我如何为给定的会话生成正确的bean实例?我想过可能会得到BeanManager并搜索SessionData的实例,但我不知道我是如何得到正确的.

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

Kor*_*gen 5

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

我通过不使用getters / setters进行成员访问来绕过代理提供的上下文bean。相反,我直接使用了package-private字段,该字段阻止了代理提供正确的实例。

我一改使用吸气剂/吸水剂,它就开始按预期工作。