@Inject不适用于CDI bean

时间:2016-08-30 02:43:29

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

我正在尝试一个关于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方法被调用后,我错过了一些小细节。

2 个答案:

答案 0 :(得分:1)

我解决了。问题是beans.xml存储在一个不正确的位置。

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

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

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

enter image description here

答案 1 :(得分:0)

从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