@Inject 初始化对象失败
@Inject fails to initialize object
我正在使用 tomee 服务器 运行 我的 javaEE 应用程序。我写了一个注入对象的过滤器。但是对象似乎没有被实例化:
以下是我的代码:
Filter.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.Can 有人告诉我我做错了什么?
确保您的存档(jar、war、...)定义了 beans.xml 文件
beans.xml 文件称为 bean 存档描述符。您可以在下面找到最简单的示例,其中只有一个根 bean xml 元素:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
此文件应放入 META-INF/beans.xml 或 WEB-INF/beans.xml。
如果您不在模块存档中包含此文件,则 CDI 注入将不会对该存档激活,因为容器不会扫描存档。
以这种方式完成规范有几个原因:
性能:容器只需要扫描你添加了beans.xml
的模块
beans.xml 还允许您定义在注入发生时必须执行的拦截器和装饰器。
请查看您的导入,它不应从任何其他库中导入 Priority。正确的是:import javax.annotation.Priority;
一旦我将 @Singleton 更改为 @ApplicationScoped.
,注入就成功了
我正在使用 tomee 服务器 运行 我的 javaEE 应用程序。我写了一个注入对象的过滤器。但是对象似乎没有被实例化:
以下是我的代码:
Filter.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.Can 有人告诉我我做错了什么?
确保您的存档(jar、war、...)定义了 beans.xml 文件
beans.xml 文件称为 bean 存档描述符。您可以在下面找到最简单的示例,其中只有一个根 bean xml 元素:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
此文件应放入 META-INF/beans.xml 或 WEB-INF/beans.xml。 如果您不在模块存档中包含此文件,则 CDI 注入将不会对该存档激活,因为容器不会扫描存档。
以这种方式完成规范有几个原因:
性能:容器只需要扫描你添加了beans.xml
的模块
beans.xml 还允许您定义在注入发生时必须执行的拦截器和装饰器。
请查看您的导入,它不应从任何其他库中导入 Priority。正确的是:import javax.annotation.Priority;
一旦我将 @Singleton 更改为 @ApplicationScoped.
,注入就成功了