无状态 bean 的依赖注入(@Inject 和 @PersistenceContext)失败
Dependency injection (@Inject and @PersistenceContext) failing for stateless bean
Env :
Wildfly 8.2.0 / Wildfly 9.0.1
我的申请结构如下
Servlet -> MyStateless1 -> MyStateless2 -> 实体管理器 api
只要 MyStateless1
和 MyStateless2
都不是 EJB,它就可以完美地使用纯 CDI 注入,即能够成功查询数据库。一旦我将 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 文件,但我还用 Stateless 创建了一个 WAR
和JPA代码分离成一个jar文件。同样的问题。
- 用
@Stateless
和 @LocalBean
/ @Local
注释 MyStateless1
。
同样的问题
- 在 8.2.0 和 9.0.1 两个 wildfly 版本中都尝试过。同样的问题
非常感谢thoughts/help。
提前致谢,
拉克什
感谢@JBNizet;是方法中的 'final' 修饰符导致了这个问题。
Env :
Wildfly 8.2.0 / Wildfly 9.0.1
我的申请结构如下
Servlet -> MyStateless1 -> MyStateless2 -> 实体管理器 api
只要 MyStateless1
和 MyStateless2
都不是 EJB,它就可以完美地使用纯 CDI 注入,即能够成功查询数据库。一旦我将 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 文件,但我还用 Stateless 创建了一个 WAR 和JPA代码分离成一个jar文件。同样的问题。
- 用
@Stateless
和@LocalBean
/@Local
注释MyStateless1
。 同样的问题 - 在 8.2.0 和 9.0.1 两个 wildfly 版本中都尝试过。同样的问题
非常感谢thoughts/help。
提前致谢,
拉克什
感谢@JBNizet;是方法中的 'final' 修饰符导致了这个问题。