【问题标题】:@Inject in base class is null in base class methods, ok in derived class基类中的@Inject 在基类方法中为空,在派生类中可以
【发布时间】: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


【解决方案1】:

这是 Weld 中的一个错误。如果它与其他范围一起使用,这是自定义范围与 Weld 结合使用的错误。

【讨论】:

  • 我会提请焊接团队注意的。
【解决方案2】:

原来我发帖时对问题的理解是基于 太有限的一组观察 - 这都是错误的。事实证明,实际问题是我没有在接受泛型类型参数的重载方法中使用@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 注入的问题相同。真的很大!

http://java.net/jira/browse/GLASSFISH-17235

【讨论】:

    猜你喜欢
    • 2014-09-05
    • 1970-01-01
    • 2018-10-12
    • 2018-05-16
    • 2019-07-25
    • 1970-01-01
    • 2013-05-18
    • 2021-07-06
    相关资源
    最近更新 更多