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

时间:2015-10-25 10:31:01

标签: java java-ee jpa dependency-injection cdi

Env :

Wildfly 8.2.0 / Wildfly 9.0.1

我的申请结构如下

Servlet - > MyStateless1 - > MyStateless2 - >实体经理api

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

这是代码

@PersistenceContext

第一级Bean

@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(); } } 时,@Stateless内的注入无效,即MyStsteless2@Inject

文件夹结构如下

@PersistenceContext

我曾尝试过:

  • 上面的代码是一个WAR文件,但我也用无状态创建了一个WAR 和JPA代码分隔成一个jar文件。同样的问题。
  • 带有├── 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 MyStateless1 / @Stateless的带注释的@LocalBean。 同样的问题
  • 尝试两种野生蝇类,即8.2.0和9.0.1。同样的问题

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

提前致谢,

勒凯什

1 个答案:

答案 0 :(得分:1)

感谢@JBNizet;这是最终的&#39;导致问题的方法中的修饰符。