Использование CDI/ инъекций в Tomcat Websocket / Serverendpoint

Я использую Tomcat 9.0.4 и Java 1.8. В том же проекте Джерси предоставляет веб-сервис. Я могу без проблем использовать @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.

Я нашел этот запрос функции. Так что я думаю, что Инъекция все еще не реализована в Tomcat.

Мои вопросы:

  • Как правильно записать свои входящие данные в мой репозиторий?
  • Есть ли другой способ заставить Injection работать?

В данный момент я думаю о миграции на стеклянную рыбу, которая должна поддерживать инъекцию из Serverendpoint

1 ответ

Решение

Вы можете использовать следующий конфигуратор, чтобы заставить 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,


В качестве альтернативы вы можете программно искать экземпляр компонента, используя:

SomeSortOfBean bean = CDI.current().select(SomeSortOfBean.class).get();
Другие вопросы по тегам