我想通过我的应用程序中的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控制器。问题是有人见过这种工作行为吗?至少我要确认这不起作用或确认我做错了什么。谢谢
答案 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;
}
}
POST
到/foobar-rest
的工作符合预期:
curl -X POST "http://localhost:8080/foobar-rest" -d "Test1"
只需登录Received Test1
并返回Answer to Test1
作为HTTP响应。
注册到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仍然可以正常工作。