簡體   English   中英

spring 是否同時支持 Rest 和 Websocket 控制器/連接?

[英]does spring support Rest and Websocket controllers/connection at the same time?

我想通過rest api(和其他一些東西)和我的應用程序中的websockets的主要功能對用戶進行授權。 我面臨下一個問題。 想象一下,我有一個帶有下一個控制器的超級簡單的 spring 應用程序。

@RestController
public class FieldController
{
    @ResponseBody
    @RequestMapping(value = "/getString", method = RequestMethod.GET)
    public String getString()
    {
        return "[{\"id\":11, \"name\":\"qwer\"}]";
    }
}

它工作得很好,我通過這個 URL 在瀏覽器中看到了響應。 但是當我嘗試將 websocket 配置類添加到應用程序時

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer
{
    public void registerStompEndpoints(StompEndpointRegistry registry)
    {
        registry.addEndpoint("/socket").withSockJS();
    }

    public void configureMessageBroker(MessageBrokerRegistry registry)
    {
        registry.setApplicationDestinationPrefixes("/app")
        .enableSimpleBroker("/chat");
    }
}

瀏覽器停止查看此 url。 在日志中:

org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping for GET /app/getString

我不知道為什么,谷歌也不知道。 也許是因為 spring 將其視為 websocket 控制器。 問題是有人見過這種工作行為嗎? 至少我想確認這不應該起作用或確認我做錯了什么。 謝謝

答案有點晚了,但請參閱上面的示例所采用的以下配置和控制器:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
        stompEndpointRegistry.addEndpoint("/socket")
                             .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry messageBrokerRegistry) {
        messageBrokerRegistry.enableSimpleBroker("/chat");
        messageBrokerRegistry.setApplicationDestinationPrefixes("/app");
    }
}
@Slf4j
@RestController
public class FooBarController {

    @MessageMapping("/foobar-ws")
    @PostMapping("/foobar-rest")
    public String foobar(@RequestBody String in) {
        LOG.debug("Received {}", in);
        return "Answer to " + in;
    }
}

使用 HTTP/REST 進行測試

POST/foobar-rest按預期工作:

curl -X POST "http://localhost:8080/foobar-rest" -d "Test1"

它只是記錄Received Test1並將Answer to Test1作為 HTTP 響應返回Answer to Test1

使用 WS/STOMP 進行測試

注冊到http://localhost:8080/socket然后將Test2發送到/app/foobar-ws結果在日志Received Test2

擴展示例

首先在方法中添加@SendTo注解:

@MessageMapping("/foobar-ws")
@PostMapping("/foobar-rest")
@SendTo("/chat/loremipsum")
public String foobar(@RequestBody String in) {
    LOG.debug("Received {}", in);
    return "Answer to " + in;
}

然后,同上,注冊到http://localhost:8080/socket並訂閱/chat/loremipsum 然后,當您將Test3發送到/app/foobar-ws ,輸入會被記錄下來( Received Test3 )並返回到 WebSocket 客戶端( Answer to Test3 )。 順便說一下,HTTP 仍然可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM