@Inject无法初始化对象

时间:2016-04-05 05:40:42

标签: java-ee cdi tomee tomee-7

我正在使用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。有人让我知道我做错了什么?

3 个答案:

答案 0 :(得分:2)

当我将 @Singleton 更改为 @ApplicationScoped 时,注入工作正常。

答案 1 :(得分:0)

请查看您的导入,不应从任何其他库导入优先级。正确的是:import javax.annotation.Priority;

答案 2 :(得分:-2)

确保您的存档(jar,war,...)已定义beans.xml文件

beans.xml文件称为bean归档描述符。下面你可以找到一个只有root 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还允许您定义在注入时必须执行的拦截器和装饰器。

礼貌:Solving @Inject NullPointerException

相关问题