【问题标题】:Undertow Websocket Bean Injection CDI IssueUndertow Websocket Bean 注入 CDI 问题
【发布时间】:2017-02-16 22:56:24
【问题描述】:

我不明白为什么 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}

【问题讨论】:

  • 您问题的最后一部分令人困惑。您是否正在实例化您的RetrieveAccessor?你还提到undertow ..你在使用weld servlet吗?野蝇?
  • 我只是在使用 undertow,我的问题的最后一部分只是解释了该 bean 对象的正常类初始化有效,这样做会产生什么后果。

标签: java dependency-injection cdi undertow jsr356


【解决方案1】:

在 @ServerEndpoint 注释类上进行注入的一种简单方法是设置一个自定义配置器,该配置器通过覆盖 getEndpointInstance(Class endpointClass) 方法以使用 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();
    }
}

【讨论】:

  • 我将在今天晚些时候或明天尝试这个,如果它有效,我会标记它是正确的,我已经看到这个但没有真正尝试过,我认为你解释得很好。
  • 很抱歉没有早点解决这个问题,所以我之前尝试过类似的东西,但我一定做错了。这是正确答案,非常感谢。
  • 不错的解决方案! (+1)
【解决方案2】:

Undertow 只是一个 servlet 容器。 Weld(或 OWB)提供 CDI 支持。我不确定您如何实例化 Undertow,但您需要利用 Weld(或其他一些 CDI 实现)。

这是一个如何做到这一点的例子。利用CDI Extension 查找端点,一旦你有了它们,你就可以register them in Undertow

请随意使用 Hammock。

【讨论】:

  • 我将 undertow 用作独立的 Web 服务/镜像服务。我最初不明白你在问什么,但是是的,我正在使用 Weld 来提供我的 CDI 支持,这应该会有所帮助,我有点忙,如果我能够实施你向我展示的解决我的问题,我会将其标记为正确/接受的答案。谢谢你。 (PS:你的框架很酷)
猜你喜欢
  • 2011-10-16
  • 1970-01-01
  • 2014-06-02
  • 2015-04-15
  • 2015-02-12
  • 2016-06-08
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多