如何将@Autowired 与@ServerEndpoint 一起使用?

我知道关于这个话题有很多问题。我已经阅读了 spring boot doc 和这里的所有解决方案。根据 spring boot doc,@ServerEndpoint是一个 Javax 注释,@Autowired组件由 spring-boot 管理。这两个不能一起使用。对此的解决方案是添加SpringConfigurator为ServerEndpoint. 当我尝试这个时,我确实收到以下错误:


未能找到根 WebApplicationContext。是否未使用 ContextLoaderListener?


spring-boot websocket页面中没有示例可以使用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. 添加此内容后,我仍然收到详细信息中提到的错误。


MMMHUHU
浏览 393回答 1
1回答

动漫人物

经过一番研究,我找到了一种强制 spring-boot 将组件注入外部管理/实例化类的方法。1)向您的类添加一个泛型方法,ApplicationContextAware以返回一个bean。@Componentpublic class SpringContext implements ApplicationContextAware {&nbsp; &nbsp; private static ApplicationContext context;&nbsp; &nbsp; @Override&nbsp; &nbsp; public void setApplicationContext(ApplicationContext context) throws BeansException {&nbsp; &nbsp; &nbsp; &nbsp; SpringContext.context = context;&nbsp; &nbsp; }&nbsp; &nbsp; public ApplicationContext getApplicationContext() {&nbsp; &nbsp; &nbsp; &nbsp; return context;&nbsp; &nbsp; }&nbsp; &nbsp; // Generic method to return a beanClass&nbsp; &nbsp; public static <T> T getBean(Class<T> beanClass)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return context.getBean(beanClass);&nbsp; &nbsp; }}2) 使用该方法初始化要注入的类对象private IntelligentResponseService responseServiceFacade = SpringContext.getBean(IntelligentResponseService.class);因此,在上述更改后,我的 websocket 控制器将如下所示@ServerEndpoint(value = "/call-stream", configurator = SpringConfigurator.class)public class CallStreamWebSocketController{&nbsp;&nbsp;&nbsp; &nbsp; private IntelligentResponseService responseServiceFacade = SpringContext.getBean(IntelligentResponseService.class);&nbsp; &nbsp; // Other methods}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java