基类中的@Inject在基类方法中为null,在派生类中为ok

时间:2011-12-10 18:18:30

标签: cdi jboss-weld codi

在下面的代码中,我试图将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问题?

感谢。

2 个答案:

答案 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相同的问题。真是个大人物!

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