Java Spring Boot-如何在@ServerEndpoint中使用@Autowired?

时间:2018-10-11 11:57:02

标签: java spring-boot autowired java-websocket

我知道这个主题有很多问题。我已经在这里阅读了spring boot doc和所有解决方案。根据spring boot doc,@ServerEndpoint是Javax注释,@Autowired组件是spring-boot管理的。这两个不能一起使用。解决方案是将SpringConfigurator添加为ServerEndpoint的配置器。当我尝试此操作时,确实出现以下错误:

  

找不到根WebApplicationContext。是否不使用ContextLoaderListener?

spring-boot websocket 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();
    }
}

编辑: 这已被标记为this问题的重复项。我已经尝试了答案中指定的解决方案。解决方案是将SpringConfigurator添加为@ServerEndpoint的配置器。添加完之后,我仍然得到细节中提到的错误。

1 个答案:

答案 0 :(得分:0)

经过一番研究,我找到了一种方法来强制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);

因此,在进行了上述更改之后,我的websocket控制器将如下所示

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

    // Other methods
}