我知道这个主题有很多问题。我已经在这里阅读了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
的配置器。添加完之后,我仍然得到细节中提到的错误。
答案 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
}