[英]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;
}
}
POST
到/foobar-rest
按預期工作:
curl -X POST "http://localhost:8080/foobar-rest" -d "Test1"
它只是記錄Received Test1
並將Answer to Test1
作為 HTTP 響應返回Answer to Test1
。
注冊到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.