我试图在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时,我得到空指针异常。
答案 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"
并检查发生的情况。