【问题标题】:@Inject not working for CDI bean@Inject 不适用于 CDI bean
【发布时间】:2016-08-30 02:43:28
【问题描述】:

我正在 JBOSS 上尝试一个非常简单的示例。

我定义了以下类

import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject; 

@Singleton
@Startup
public class PRCConnectionRunner {

@Inject
private PRCConfiguration prcConfiguration;

@PostConstruct
void printthing() {
    System.out.println("HI");

    System.out.println(prcConfiguration== null);
}   

}


public class PRCConfiguration {
 public String greet(String name) {
        return "Hello, " + name + ".";
    }
}

我在 WEB-INF 目录中定义了 beans.xml,我将其打包为来自 maven 的战争。

但是,当我在 JBOSS 服务器上部署并启动它时,我确实打印了 HI,但没有注入依赖项,因为我得到了 null 测试的真值。 我究竟做错了什么? 我相信由于调用了@PostConstruct 方法,我缺少一些小细节。

【问题讨论】:

标签: java maven jakarta-ee dependency-injection jboss


【解决方案1】:

我解决了。问题是 beans.xml 存储在错误的位置。

beans.xml 应该始终用于 Web 应用程序。

src\main\webapp\WEB-INF\beans.xml

如果您使用 eclipse/jboss,一个快速的方法是检查已部署的资源菜单是否正在填充 beans.xml。当我把它放在正确的位置时,jboss 会自动更新已部署的资源菜单项。

【讨论】:

    【解决方案2】:

    从 CDI 1.1 开始,并非每个类都由 CDI 上下文管理。您必须通过注释 指定它或将bean-discovery-mode="ALL" 放入您的beans.xml,然后在不应由CDI 管理的类上使用@Vetoed。默认值为bean-discovery-mode="ANNOTATED"。 我的建议是使用适当的注释来注释您的类(取决于 bean 的生命周期)。

    还要检查您的 bean.xml 文件是否位于 ..\webapp\WEB-INF\beans.xml

    Default CDI Enablement in Java EE 7

    【讨论】:

      猜你喜欢
      • 2014-12-20
      • 1970-01-01
      • 2011-05-07
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      相关资源
      最近更新 更多