spring是否同时支持Rest和Websocket控制器/连接?

时间:2019-06-01 21:32:55

标签: java spring rest websocket

我想通过我的应用程序中的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控制器。问题是有人见过这种工作行为吗?至少我要确认这不起作用或确认我做错了什么。谢谢

1 个答案:

答案 0 :(得分:0)

答案有点晚,但是请参见上面示例中采用的以下配置和控制器:

@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响应。

使用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仍然可以正常工作。