1

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

谢谢。

4

2 回答 2

1

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

于 2011-12-12T10:30:02.537 回答
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

于 2011-12-15T09:57:10.013 回答