Использование CDI / инъекций в Tomcat Websocket / Serverendpoint - PullRequest
0 голосов
/ 04 июля 2018

Я использую Tomcat 9.0.4 и Java 1.8. В том же проекте Джерси предоставляет веб-сервис. Я могу без проблем использовать @ Inject из классов веб-сервиса. Я пытаюсь заставить инъекцию работать с моего экрана конечной точки веб-сокета ниже.

@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.

Мои вопросы:

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

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

1 Ответ

0 голосов
/ 04 июля 2018

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