Undertow Websocket Bean 注入 CDI 问题
Undertow Websocket Bean Injection CDI Issue
我不明白为什么 CDI 使用注入不适用于 websockets,使用 undertow。
下面是我为简单的 websocket 端点编写的代码。
@ServerEndpoint("/")
public class TestWebSocketEndpoint {
@Inject
private RetrieveAccessor retrieveAccessor;
private final Logger logger = Logger.getLogger(this.getClass().getName());
@OnOpen
public void onConnectionOpen(Session session) {
logger.info("Connection opened ... " + session.getId());
}
@OnMessage
public String onMessage(String message) {
if (!message.isEmpty()) {
return message;
}
System.out.println("RETRIEVE BEAN -> " + retrieveAccessor);
if (retrieveAccessor != null) {
return "BEAN NOT NULL";
}
return ":(";
}
@OnClose
public void onConnectionClose(Session session) {
logger.info("Connection close .... " + session.getId());
}
}
当然问题是注入的属性是空的。对于下面描述的无状态 bean 的部署和注入,我当然可以使用其余方面的东西。有没有解决这个问题的方法,如果我只是初始化我需要的属性是 bean,我可以 运行 遇到什么问题?因为那绝对有效。
RetrieveAccessor retrieveAccessor = new....{code}
Undertow 只是一个 servlet 容器。 Weld(或 OWB)提供 CDI 支持。我不确定您如何实例化 Undertow,但您需要利用 Weld(或其他一些 CDI 实现)。
这是一个如何做到这一点的例子。利用 CDI Extension to find the endpoints, and once you have them you can register them in Undertow
请随意使用 Hammock。
在带注释的@ServerEndpoint 上进行注入的一种简单方法 类 是设置一个自定义配置器,通过覆盖 getEndpointInstance(Class 端点[=21 来处理端点实例的创建=]) 用 CDI 实例化的方法。
https://tyrus.java.net/documentation/1.13/user-guide.html#d0e464
带注释的端点:
@ServerEndpoint(value = "/", configurator = CDIEndpointConfigurator.class)
public class TestWebSocketEndpoint {
...
}
自定义配置器:
public class CDIEndpointConfigurator extends ServerEndpointConfig.Configurator {
@Override
public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException {
return CDI.current().select(endpointClass).get();
}
}
我不明白为什么 CDI 使用注入不适用于 websockets,使用 undertow。
下面是我为简单的 websocket 端点编写的代码。
@ServerEndpoint("/")
public class TestWebSocketEndpoint {
@Inject
private RetrieveAccessor retrieveAccessor;
private final Logger logger = Logger.getLogger(this.getClass().getName());
@OnOpen
public void onConnectionOpen(Session session) {
logger.info("Connection opened ... " + session.getId());
}
@OnMessage
public String onMessage(String message) {
if (!message.isEmpty()) {
return message;
}
System.out.println("RETRIEVE BEAN -> " + retrieveAccessor);
if (retrieveAccessor != null) {
return "BEAN NOT NULL";
}
return ":(";
}
@OnClose
public void onConnectionClose(Session session) {
logger.info("Connection close .... " + session.getId());
}
}
当然问题是注入的属性是空的。对于下面描述的无状态 bean 的部署和注入,我当然可以使用其余方面的东西。有没有解决这个问题的方法,如果我只是初始化我需要的属性是 bean,我可以 运行 遇到什么问题?因为那绝对有效。
RetrieveAccessor retrieveAccessor = new....{code}
Undertow 只是一个 servlet 容器。 Weld(或 OWB)提供 CDI 支持。我不确定您如何实例化 Undertow,但您需要利用 Weld(或其他一些 CDI 实现)。
这是一个如何做到这一点的例子。利用 CDI Extension to find the endpoints, and once you have them you can register them in Undertow
请随意使用 Hammock。
在带注释的@ServerEndpoint 上进行注入的一种简单方法 类 是设置一个自定义配置器,通过覆盖 getEndpointInstance(Class 端点[=21 来处理端点实例的创建=]) 用 CDI 实例化的方法。
https://tyrus.java.net/documentation/1.13/user-guide.html#d0e464
带注释的端点:
@ServerEndpoint(value = "/", configurator = CDIEndpointConfigurator.class)
public class TestWebSocketEndpoint {
...
}
自定义配置器:
public class CDIEndpointConfigurator extends ServerEndpointConfig.Configurator {
@Override
public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException {
return CDI.current().select(endpointClass).get();
}
}