gpt4 book ai didi

Java Spring-boot - 如何将@Autowired 与@ServerEndpoint 一起使用?

转载 作者:行者123 更新时间:2023-11-30 10:10:34 25 4
gpt4 key购买 nike

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

Failed to find the root WebApplicationContext. Was ContextLoaderListener not used?

spring-boot websocket中没有例子page使用 ContextLoaderListener。如何使用 ContextLoaderListener 将组件注入(inject)到 @ServerEndpoint 注释的 Controller 中?

以下是我的代码。

网络套接字 Controller

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

// Other methods
}

网络套接字配置

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

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

编辑:这已被标记为 this 的副本问题。我已经尝试了答案中指定的解决方案。解决方案是添加 SpringConfigurator 作为 @ServerEndpoint 的配置器。添加这个之后,我仍然得到详细信息中提到的错误。

最佳答案

经过一些研究,我找到了一种方法来强制 spring-boot 将组件注入(inject)到外部管理/实例化的类中。

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) 使用该方法初始化你要注入(inject)的类对象

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

所以在上面的更改之后我的 websocket Controller 看起来像这样

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

// Other methods
}

关于Java Spring-boot - 如何将@Autowired 与@ServerEndpoint 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52759493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com