我有一个Spring @Controller类,它有一个@MessageMapping注释的方法,如下所示:
@MessageMapping("/trade")
public void executeTrade(MarketOrderRequest trade, Principal principal) {
trade.setUserID(principal.getName());
logger.debug("Trade: " + trade);
this.tradeService.executeTrade(trade);
}
我正在发送使用服务器方法接受的相同MarketOrderRequest POJO构建的JSON消息。使用一些键:值对设置为null (但仍然存在)。
WebSocketConfig类配置了以下端点:
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue/", "/topic/");
registry.setApplicationDestinationPrefixes("/app");
}
当我试图使用以下代码向消息映射发送消息时:
MarketOrderRequest request = new MarketOrderRequest();
//{set request variables..}
StompHeaders someHeaders = new StompHeaders();
someHeaders.putAll(sessionHeaders);
someHeaders.setDestination("/app/trade");
session.send(someHeaders, request);
带有标题:
{Cookie=[JSESSIONID=8421F536B639126F84F12E655375D790; Path=/spring-websocket-portfolio/; HttpOnly], version=[1.2], heart-beat=[0,0], user-name=[fabrice], destination=[/app/trade]}
然后,服务器打印无法为请求找到方法:
Searching methods to handle SEND /app/trade session=397da625042343b4bac1c913b6d8ec22 application/json;charset=UTF-8
payload={"uuid":null,"symbol":"EUR/USD","price":1.10182,"side":"1","qty":50000,"quoteID"...(truncated)
WebSocketAnnotationMethodMessageHandler[DEBUG] - No matching methods.
服务器代码从该项目中删除,并作了一些修改,以满足我的需要:链接
我在实现类中添加了一些基于角色的web套接字安全性,如下所示:
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages
.nullDestMatcher().authenticated()
.simpSubscribeDestMatchers("/user/queue/errors").permitAll()
.simpDestMatchers("/app/**").hasAnyRole("roleA", "roleB", "roleC")
//{some more subscribe dest matchers by role which are working}
}
这可能会影响WebSocketAnnotationMethodMessageHandler映射请求的尝试吗?这几乎是我对配置所做的唯一更改。我的订阅映射工作得很好。
在我看来,由于JSON或主体参数,查找方法似乎存在问题。我正在发送正确的对象类型,所以这可能是用户主体的问题吗?谢谢
发布于 2015-08-13 13:38:17
我的WebSocketConfig类中有一个错误。
@componentscan注释有错误的包名。我将名称更新为正确的值(基本包的名称,如"com.my.project“)。现在,在日志中部署期间,我可以看到控制器资源正在映射到类中的方法。
例如一种方法的日志输出:
将"{/order,messageType=MESSAGE}“映射到公共无效messageType=MESSAGE java.security.Principal)
https://stackoverflow.com/questions/31940129
复制相似问题