Использование 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();