【发布时间】:2016-04-05 05:40:41
【问题描述】:
我正在使用 tomee 服务器来运行我的 javaEE 应用程序。我写了一个注入对象的过滤器。但是该对象似乎没有被实例化:
以下是我的代码:
过滤器.java
@Priority(value = 2)
@Provider
@Singleton
public class Filter implements ContainerRequestFilter {
@Inject
private Faculty faculty;
public void filter(ContainerRequestContext requestContext) {
System.out.println("faculty name is :"+faculty.getFacultyName());
}
}
Faculty.java
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
public class Faculty {
private List<String> facultyMembers;
private String facultyName;
@PostConstruct
public void initialize() {
this.facultyMembers = new ArrayList<String>();
facultyMembers.add("Ian Schultz");
facultyMembers.add("Diane Reyes");
facultyName = "Computer Science";
}
public List<String> getFacultyMembers() {
return facultyMembers;
}
public String getFacultyName() {
return facultyName;
}
}
我正在获得 NPE。以下是堆栈跟踪:
java.lang.NullPointerException
at com.xyz.commerceapp.filters.Filter.filter(TransactionStartFilter.java:45)
at org.apache.cxf.jaxrs.utils.JAXRSUtils.runContainerRequestFilters(JAXRSUtils.java:1645)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:201)
at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:77)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
以下是正在使用的工件的版本:
<openejb.version>5.0.0-SNAPSHOT</openejb.version>
<tomee.version>2.0.0-SNAPSHOT</tomee.version>
我已经尝试在 META-INF 和 WEB-INF 中包含 beans.xml,但我仍然看到 NPE。有人可以告诉我我做错了什么吗?
【问题讨论】:
-
你为什么要直接注入到一个类成员,你不能通过将 Faculty 注入构造函数然后将其设置为“faculty”字段来做到这一点我在这里遗漏了什么?
-
你一定是错误地使用了导入
javax.ejb.Singleton而不是javax.inject.Singleton。 -
@aribeiro :我正在使用 javax.inject.Singleton。
-
下一个 TomEE 版本是 7.0.0,2.0.0 的快照已经很老了。请尝试使用 TomEE 7.0.0.M3。
标签: jakarta-ee cdi apache-tomee tomee-7