springboot+websocket使用@ServerEndPoint无法使用@Autowired注解注入Bean

最近有这么一个需求:做信息发布,后端更新布局和内容后,通知前端刷新页面,重新加载数据和布局。

  1. 使用@Autowired注入:
    在这里插入图片描述看起来一切都没有问题,但是当我运行的时候,我发现我的deviceService是空的!百度查,发现在@ServerEndPoint中是无法使用@Autowired注入Bean的。大概原理如下:
    在我们springboot项目启动的时候,WebSocket已经被注入了这个DeviceService的Bean,但是WebSocket的特点是:建立一个连接,会生成一个新的WebSocket对象,分析源码,也可以理解:每个请求后,建立一个连接生成一个新的WebSocket,故这样是不能获得自动注入的对象了。

解决方案大概如下:
获取到Spring容器,然后去进行手动注入。

因为新生成的WebSocket对象根本不存在与Spring容器中,所以传统的ContextLoader.getCurrentWebApplicationContext()自然也就无法使用。

  1. 我用到了ApplicationContextAware来在项目加载时就获得项目的Spring容器。代码如下:
    在这里插入图片描述有了spring容器,我们就可以在任何类中去拿到这个类的ApplicationContext,然后通过这个ApplicationContext我们就可以在新生成一个WebSocket对象时来手动注入Service层了。
    在这里插入图片描述
    问题就这么解决了。。。。。。。。。。。。。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Spring Boot和WebSocket时,可以使用@ServerEndpoint注解来创建WebSocket端点。要接受太大的Blob数据,可以使用以下步骤: 1. 配置WebSocket消息大小限制 在WebSocket配置类中,可以使用setAsyncSendTimeout()和setSendBufferSizeLimit()方法来设置WebSocket消息的大小限制。例如: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/myHandler") .setAllowedOrigins("*") .withSockJS(); } @Bean public WebSocketHandler myHandler() { return new MyHandler(); } @Bean public WebSocketContainer webSocketContainer() { WebSocketContainer container = ContainerProvider.getWebSocketContainer(); container.setDefaultMaxTextMessageBufferSize(1024 * 1024); // 1MB container.setDefaultMaxBinaryMessageBufferSize(1024 * 1024); // 1MB return container; } } ``` 2. 在@ServerEndpoint中接收Blob数据 在@ServerEndpoint注解的类中,可以使用@OnMessage注解来接收WebSocket消息。例如: ```java @ServerEndpoint("/myHandler") public class MyHandler { @OnMessage public void onMessage(Session session, ByteBuffer buffer) { // 处理Blob数据 // ... } } ``` 需要注意的是,WebSocket消息的类型可以是文本类型(String)或二进制类型(ByteBuffer)。在上面的示例中,我们使用ByteBuffer类型来接收Blob数据。在使用ByteBuffer时,需要调用array()方法来获取byte数组。例如: ```java byte[] bytes = buffer.array(); ``` 这样就可以接收太大的Blob数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值