【发布时间】:2011-12-10 18:18:29
【问题描述】:
在下面的代码中,我试图将 SessionScoped bean 注入到无状态 EJB,但我想在 EJB 的抽象基类中执行 @Inject。根据 CDI 规范似乎表明这应该可行(绝不是浪费文字的规范):
《4.2. 成员级元数据的继承
假设一个类 X 被 bean 类直接或间接扩展 托管 bean 或会话 bean Y。
如果 X 声明一个注入字段 x,则 Y 继承 x。"
发生的情况是我可以访问继承的受保护成员 sessionView 来自 TestEjb,但不是来自基类中的代码。当我说“可以访问”时, 我的意思是注入的成员在运行时是可访问的,并且不为空。
@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/Weld 问题?
谢谢。
【问题讨论】:
-
现在看来,如果我将 BaseClass 中 sessionView 的访问权限更改为私有,它可以工作,但前提是我关闭应用服务器并清理并构建。然后它将在重建和重新部署中可靠地工作。如果我随后将访问权限更改回受保护和清理并构建,它将始终无法正常工作,直到恢复为私有。看起来我将记录一个针对 CODI 的错误,但如果有人能对此有所了解,将不胜感激。
标签: cdi jboss-weld codi