在 Tomcat Websocket / Serverendpoint 中使用 CDI/injection
Using CDI/injection in Tomcat Websocket / Serverendpoint
我正在使用 tomcat 9.0.4 和 Java 1.8。在同一个项目中,jersey 提供了一个网络服务。我可以从网络服务 类 使用 @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 请求。所以我认为 Injection 在 tomcat 中仍然没有实现。
我的问题:
- 如何将传入数据正确写入存储库?
- 还有其他方法可以使注入工作吗?
目前我正在考虑迁移到 glassfish,它应该支持从服务器端点注入
您可以使用以下配置器让 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();
我正在使用 tomcat 9.0.4 和 Java 1.8。在同一个项目中,jersey 提供了一个网络服务。我可以从网络服务 类 使用 @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 请求。所以我认为 Injection 在 tomcat 中仍然没有实现。
我的问题:
- 如何将传入数据正确写入存储库?
- 还有其他方法可以使注入工作吗?
目前我正在考虑迁移到 glassfish,它应该支持从服务器端点注入
您可以使用以下配置器让 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();