在下面的代码中,我试图将SessionScoped bean注入无状态 EJB,但我想在EJB的抽象基类中执行@Inject。根据 CDI规范似乎表明这应该有效(绝不是浪费话语的规范):
“4.2。成员级元数据的继承
假设类X由bean类直接或间接扩展 托管bean或会话bean Y。
如果X声明了注入的字段x,则Y继承x。“
我可以访问继承的受保护成员sessionView 来自TestEjb,但不是来自基类中的代码。当我说“可以访问”时, 我的意思是注入的成员在运行时是可访问的,不是null。
@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是null。
我将MyFaces CODI 1.01与Glassfish 3.1.1的Weld结合使用。我有 尝试从BaseClass中删除摘要,甚至添加@Named,但事实并非如此 帮助,我看不出我做错了什么。
现在看起来我必须从基类继承sessionView 将其作为参数传递给基类中的方法。如果,我将不胜感激 任何人都可以指出,如果我做了一些愚蠢的事,也许这是一个CODI / Weld问题?
感谢。
答案 0 :(得分:1)
这是Weld的一个错误。如果它适用于其他范围,那么自定义范围与Weld结合就是一个错误。
答案 1 :(得分:0)
事实证明,我在发布时对问题的理解是基于 一组观察太有限了 - 一切都错了。事实证明,实际问题是我没有使用@PersistenceContext在接受泛型类型参数的重载方法中将实体管理器成功注入无状态ejb。据推测这个问题在glassfish 3.1.2中得到修复。例如:
@Stateless
public class Myejb<T> {
@PersistenceContext(unitName = "TestPU")
private EntityManager em;
public void find(String id) { em.find... }
public void find(T id) { em.find... }
find(T id)中的 em将为null,并且@EJB注入与@PersistenceContext相同的问题。真是个大人物!