无状态bean的依赖注入(@Inject和@PersistenceContext)失败


Env :
Wildfly 8.2.0 / Wildfly 9.0.1

我的应用程序结构如下

Servlet -> MyStateless1 -> MyStateless2 ->实体管理器api

只要MyStateless1MyStateless2都是非ejb,它就可以完美地使用纯CDI注入,即能够成功地查询DB。一旦我将MyStateless1标记为@Stateless,即使servlet中EJB MyStateless1@Inject工作正常,MyStateless1内部的注入本身也不起作用。注意@Inject@PersistenceContext都不能注入相关的资源。

代码

@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
    @Inject private MyStateless1 stateless1;
    protected void doGet(HttpServletRequest request, 
                         HttpServletResponse response) {
      stateless1.businessMethod();
      response.getWriter().append("Served at: ").append(request.getContextPath());
    }
}

第一级Bean

//@Stateless
public class MyStateless1 {
    @Inject private MyStateless2 stateless2;
    @PersistenceContext(unitName = "cdi-rest")
    private EntityManager entityManager;
    public MyStateless1() {
      System.out.println("MyStateless1() constructed");
    }
    public final void businessMethod() {
      if (entityManager == null ) { System.out.println(" +++++ Entity Manager is null"); }
      if (stateless2 == null ) { System.out.println(" ===== stateless2 is null"); } else { stateless2.finder(); }
    }
}

二级bean

public class MyStateless2 {
  public MyStateless2() {
    System.out.println("MyStateless2() constructed ");
  }
  @PersistenceContext(unitName = "cdi-rest")
  private EntityManager entityManager;
  public final List<MyEntity> finder() {
    TypedQuery<MyEntity> query = entityManager.createQuery("select o from MyEntity o", MyEntity.class);
    return query.getResultList();
  }
}

当我取消第一级bean中@Stateless的注释时,MyStsteless2内的注入不起作用,即@Inject@PersistenceContext

文件夹结构如下

├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── rakesh
│   │   │           ├── model
│   │   │           │   └── MyEntity.java
│   │   │           ├── persistence
│   │   │           │   └── MyStateless2.java
│   │   │           ├── service
│   │   │           │   └── MyStateless1.java
│   │   │           └── servlet
│   │   │               └── MyServlet.java
│   │   ├── resources
│   │   │   └── META-INF
│   │   │       └── persistence.xml
│   │   └── webapp
│   │       └── WEB-INF
│   │           ├── beans.xml
│   │           └── web.xml
│   └── test
│       ├── java
│       └── resources

我尝试过的:

    上面的代码是一个WAR文件,但我也创建了一个WAR与无状态和JPA代码分离到一个jar文件中。同样的问题。
  • @Stateless@LocalBean/@Local注释MyStateless1。同样的问题
  • 在两个wildfly版本即8.2.0和9.0.1中尝试过。同样的问题

任何想法/帮助都是非常感谢的。

提前感谢,

拉克什

感谢@JBNizet;是方法中的"final"修饰符导致了这个问题。

最新更新