2016-10-07 4 views
2

Я не понимаю, почему использование CDI для инъекций не работает с веб-гнездами, используя подносы.Undertow Websocket Bean Injection CDI Issue

Ниже приведен код, который у меня есть для простой конечной точки 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()); 
    } 

} 

Конечно, проблема заключается в том, что введенное свойство равно null. У меня нет никаких проблем, конечно, используя остальную часть вещей для этого развертывания и инъекции компонента без состояния, описанного ниже. Есть ли работа для этого, каковы проблемы, с которыми я мог столкнуться, если бы я только начал объекты, которые мне нужны, это beans? Потому что это определенно работает.

RetrieveAccessor retrieveAccessor = новый .... {код}

+0

Последняя часть вашего вопроса запутанная. Вы создаете экземпляр своего «RetrieveAccessor»? Вы также упоминаете о том, что вы используете. wildfly? –

+0

Я просто использую подхват, и последняя часть моего вопроса просто объясняет, что нормальная инициализация класса этого компонента bean-объекта работает, каковы будут последствия этого. – thekevshow

ответ

2

Простой способ получить инъекции, выполняемые в ваших аннотированных классах @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(); 
    } 
} 
+0

Я попробую это позже сегодня или завтра, и отметьте это правильно, если это сработает, я видел это, но на самом деле не пытался это сделать, я думаю, вы хорошо это объяснили. – thekevshow

+0

Извините, что раньше этого не делал, поэтому раньше я пробовал что-то подобное, но, должно быть, сделал это неправильно. Это правильный ответ, большое вам спасибо. – thekevshow

+0

Добро пожаловать. –

1

Undertow только сервлет контейнер. Weld (или OWB) обеспечивают поддержку CDI. Я не уверен, как вы создаете Undertow, но вам нужно использовать Weld (или некоторую другую реализацию CDI).

Вот один пример, как это сделать. Воспользуйтесь CDI Extension, чтобы найти конечные точки, и после того, как у вас есть они, вы можете register them in Undertow

Не стесняйтесь использовать гамак для этого.

+0

Я использую платформу как автономный веб-сервис/сервис mircro. Я изначально не понимал, о чем вы спрашивали, но да, я использовал Weld для поддержки моего CDI, это должно быть полезно, я был немного занят, если я смог реализовать то, что вы показали мне как решение моей проблемы, Я отмечу это как правильный/принятый ответ. Спасибо. (PS: ваш фреймворк крут) – thekevshow

Смежные вопросы