在下面的代码中,我试图将 SessionScoped bean 注入到无状态 EJB 中,但我想在 EJB 的抽象基类中执行 @Inject。根据 CDI 规范,它似乎表明这应该有效(绝不是浪费文字的规范):
"4.2. 成员级元数据的继承
假设类 X 由托管 bean 或会话 bean Y 的 bean 类直接或间接扩展。
如果 X 声明一个注入字段 x,则 Y 继承 x。”
发生的情况是我可以从 TestEjb 访问继承的受保护成员 sessionView,但不能从基类中的代码访问。当我说“可以访问”时,我的意思是注入的成员在运行时可以访问并且不为空。
@Named
@ViewAccessScoped
public class JsfBean extends implements Serializable {
@Inject private TestEjb ejb;
SessionView s1 = ejb.getSessionViewChild(); // sessionView injected ok
SessionView s2 = ejb.getSessionViewBase(); // sessionView is null
}
@Named
@SessionScoped
public class SessionView implements Serializable {}
@Stateless
public class TestEjb extends BaseClass implements Serializable {
public SessionView getSessionViewChild() {
return sessionView;
}
}
public abstract class BaseClass implements Serializable {
@Inject
protected SessionView sessionView;
public SessionView getSessionViewBase() {
return sessionView;
}
}
发生的情况是 s1 是有效的 SessionView 引用,但 s2 为空。
我将 MyFaces CODI 1.01 与 Glassfish 3.1.1 中的 Weld 结合使用。我尝试从 BaseClass 中删除抽象,甚至添加了@Named,但这并没有帮助,我看不出我做错了什么。
就目前而言,看起来我必须从基类继承 sessionView 并将其作为参数传递回基类中的方法。因此,如果有人能指出我是否在做一些愚蠢的事情,我将不胜感激,也许这是一个 CODI/焊接问题?
谢谢。