【问题标题】:@Inject fails to initialize object@Inject 初始化对象失败
【发布时间】: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


【解决方案1】:

一旦我将 @Singleton 更改为 @ApplicationScoped,注入就会起作用。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      确保您的存档(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 还允许您定义在注入发生时必须执行的拦截器和装饰器。

      礼貌:Solving @Inject NullPointerException

      【讨论】:

      • 我在问题中提到过:“我已经尝试在 META-INF 和 WEB-INF 中包含 beans.xml,但我仍然看到 NPE。”
      • 一个愚蠢的疑问可能是:你的 beans.xml 中是否有一个 bean 引用了 Faculty 类?
      • 它没有。我的印象是注释会负责接线,一个空的 bean.xml 就足够了。
      • 你能在Faculty课上试试@Default注解吗?在public class Faculty上引入@Default注解@
      • 没有帮助。 NPE 持续存在。
      猜你喜欢
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2016-03-25
      • 2012-11-17
      • 2017-12-10
      相关资源
      最近更新 更多