使用wildfly 9的构造函数注入不起作用

时间:2015-11-02 08:17:02

标签: java-ee dependency-injection cdi wildfly

我试图在wildfly 9.0.2 final上部署一个简单的WAR文件。 WAR目前没有web.xml,也没有EJB - 只是通过注释,在构造函数和工厂中使用依赖注入的websocket端点来生成依赖项。在部署时,我收到错误:

java.lang.NoSuchMethodException: com.aip.textspace.infra.control.websocket.MainEndPoint.<init>

看起来widlfly试图调用一个不存在的null构造函数。这是MainEndPoint的构造函数:

@Inject
public MainEndPoint(SessionController control) {
    super();
    this.control = control;
}

我有另一个名为SessionControllerFactory的类,它有一个用于注入的生产者方法:

@Produces
public SessionController build() {
...

在Maven POM中,我引用了CDI库:

   <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <scope>provided</scope>
    </dependency>

那么我遗漏了什么让wildfly通过依赖注入来调用构造函数呢?

BTW,基于related response,我尝试向MainEndPoint添加一个null构造函数。在这种情况下,部署成功,但注入永远不会发生,并且当在MainEndPoint中访问this.control时,我得到空指针异常。

1 个答案:

答案 0 :(得分:1)

原因似乎很明显:不知怎的SessionController还没有被注册为CDI bean。

请确保使用以下代码:

 @Produces
 public SessionController build() {
    ...
 }

@Produces注释为@javax.enterprise.inject.Produces,而不是@javax.ws.rs.Produces意外。

另外请确保您的war档案中包含SessionControllerFactory它是托管bean类

BTW:你没有提及你的beans.xml文件(在WildFly 9和EE 7中是可选的)。出于测试目的,您可以添加此类文件,设置其属性bean-discovery-mode="ALL"并检查发生的情况。