在Tomcat Websocket / Serverendpoint中使用CDI /注入

时间:2018-07-04 14:27:37

标签: tomcat jersey cdi java-websocket tomcat9

我正在使用tomcat 9.0.4和Java 1.8。在同一项目中,jersey正在提供Web服务。我可以从网络服务类中使用 @Inject ,没有任何问题。我正在尝试从下面的websocket端点显示中进行注入。

@ApplicationScoped
@ServerEndpoint("/endpoint")
public class ArchApi {

  @Inject RepClass injectedClass;

  @OnMessage()
  public String onMessage(byte[] data) {
       injectedClass.doThings("test");
  }

}

这是我的CDI实现:

    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
        <version>2.27</version>
    </dependency>

我得到的只是一个 java.lang.NullPointerException

我找到了这个feature请求。因此,我认为在Tomcat中仍未实现注入。

我的问题:

  • 我如何正确地将传入数据写入存储库?
  • 还有其他方法可以使Injection工作吗?

此刻,我正在考虑迁移到glassfish,这应该支持从Serverendpoint注入

1 个答案:

答案 0 :(得分:0)

您可以使用以下配置器使CDI管理端点类:

public class CdiAwareConfigurator extends ServerEndpointConfig.Configurator {

    public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException {
        return CDI.current().select(endpointClass).get();
    }
}

然后注释您的终结点类,如下所示:

@ServerEndpoint(value = "/chat", configurator = CdiAwareConfigurator.class)
public class ChatEndpoint {
    ...
}

根据您的CDI配置,您可能需要使用@Dependent注释终结点类。


或者,您可以使用以下方式以编程方式查找bean实例:

SomeSortOfBean bean = CDI.current().select(SomeSortOfBean.class).get();