【问题标题】:Spring Boot endpoints + webSocketSpring Boot 端点 + webSocket
【发布时间】:2020-04-18 19:28:12
【问题描述】:

我正在开发应用程序,它具有用于实体上的 CRUD 操作的常规端点(我正在注入控制器),应用程序的流程应该使实体的属性不断变化,所以我需要通知前端这些变化实时。这就是我注册Web Socket的原因

@Configuration 
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {
    webSocketHandlerRegistry.addHandler(new PositionHandler(),"/positions").setAllowedOrigins("*");
}

class PositionHandler extends TextWebSocketHandler {

    private List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
       sessions.add(session);
       while(session.isOpen()){
          HERE I WOULD LIKE TO ACCESS METHOD FOR  CONTROLLER
       }


        super.afterConnectionEstablished(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
       for(WebSocketSession s: sessions){
            session.sendMessage(message);
        }

        super.handleTextMessage(session, message);
    }
}

}

在 afterConnectionEstablished 内部我想使用注入到普通 @RestController 类的控制器中的方法。有没有可能做到这一点?如果不是,我应该如何重构。 PS WebSocket 有效。

【问题讨论】:

  • 在 spring 中查找 STOMP,您可以在控制器中使用 SimpMessagingTemplate

标签: java spring spring-boot websocket


【解决方案1】:

您可以在处理程序中进行依赖注入(@Autowired 注释)并从休息控制器调用方法。但你为什么要这样做?控制器内部有业务逻辑吗?

【讨论】:

  • 是的,我确实有业务逻辑,我应该把它移到其他地方吗?
  • 如果您使用的是 3 层(控制器、服务、存储库)架构,业务逻辑通常应该放在服务层中......但这超出了这个问题的范围。 (移动逻辑既不能解决您的问题,也不能使示例更简单)
  • 我在 RestController 类中已经有 Autowired 注释,我尝试将它也添加到 Handler 但是当建立连接时,handler = null 中的控制器
  • 将处理程序类标记为@Component
猜你喜欢
  • 2021-01-08
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2016-05-06
  • 2020-06-17
  • 2015-07-24
  • 2021-01-16
  • 2015-01-31
相关资源
最近更新 更多