Java Spring-boot - Как использовать @Autowired с @ServerEndpoint? - PullRequest
0 голосов
/ 11 октября 2018

Я знаю, что есть много вопросов на эту тему.Я прочитал весенний загрузочный документ и все решения здесь.Согласно Spring Boot Doc, @ServerEndpoint является аннотацией Javax, а @Autowired компоненты управляются Spring-Boot.Эти два нельзя использовать вместе.Решением этой проблемы было бы добавить SpringConfigurator в качестве конфигуратора ServerEndpoint.Когда я попробовал это, я получаю следующую ошибку:

Не удалось найти корневой WebApplicationContext.Был ли ContextLoaderListener не использован?

Нет примера в веб-сокете при загрузке page для использования ContextLoaderListener.Как можно использовать ContextLoaderListener, чтобы компоненты могли быть внедрены в @ServerEndpoint аннотированные контроллеры?

Ниже приведен мой код.

Контроллер Websocket

@ServerEndpoint(value = "/call-stream", configurator = SpringConfigurator.class)
public class CallStreamWebSocketController
{  
    @Autowired
    private IntelligentResponseService responseServiceFacade;

    // Other methods
}

Конфигурации Websocket

@Configuration
public class WebSocketConfiguration
{
    @Bean
    public CallStreamWebSocketController callStreamWebSocketController()
    {
        return new CallStreamWebSocketController();
    }

    @Bean
    public ServerEndpointExporter serverEndpointExporter()
    {
        return new ServerEndpointExporter();
    }
}

Редактировать: Этот файл был помечен как дубликат этого вопроса.Я пробовал решение, указанное в ответах.Решение состоит в том, чтобы добавить SpringConfigurator в качестве конфигуратора @ServerEndpoint.После добавления этого я все еще получаю ошибку, упомянутую в деталях.

1 Ответ

0 голосов
/ 13 октября 2018

После некоторых исследований я нашел способ заставить spring-boot внедрить компонент во внешне управляемый / созданный экземпляр класса.

1) Добавить универсальный метод в ваш класс, расширяющий ApplicationContextAware для возврата bean-компонента.

@Component
public class SpringContext implements ApplicationContextAware {

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        SpringContext.context = context;
    }

    public ApplicationContext getApplicationContext() {
        return context;
    }

    // Generic method to return a beanClass
    public static <T> T getBean(Class<T> beanClass)
    {
        return context.getBean(beanClass);
    }
}

2) Используйте этот метод для инициализации объекта класса, который вы хотите внедрить

private IntelligentResponseService responseServiceFacade = SpringContext.getBean(IntelligentResponseService.class);

Так что после вышеуказанных изменений мой контроллер веб-сокета будет выглядеть так

@ServerEndpoint(value = "/call-stream", configurator = SpringConfigurator.class)
public class CallStreamWebSocketController
{  
    private IntelligentResponseService responseServiceFacade = SpringContext.getBean(IntelligentResponseService.class);

    // Other methods
}
...