为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMMHUHU 2021-11-11 16:48:11
我知道关于这个话题有很多问题。我已经阅读了 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 配置@Configurationpublic class WebSocketConfiguration{    @Bean    public CallStreamWebSocketController callStreamWebSocketController()    {        return new CallStreamWebSocketController();    }    @Bean    public ServerEndpointExporter serverEndpointExporter()    {        return new ServerEndpointExporter();    }}编辑:这已被标记为此问题的副本。我已经尝试了答案中指定的解决方案。解决方案是添加SpringConfigurator为@ServerEndpoint. 添加此内容后,我仍然收到详细信息中提到的错误。
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

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

}


查看完整回答
反对 回复 2021-11-11
  • 1 回答
  • 0 关注
  • 380 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信