MessageMapping处理程序——没有匹配的方法



我有一个Spring webservice @Controller类和一个@MessageMapping注释方法,如下所示:

@MessageMapping("/trade")
public void executeTrade(MarketOrderRequest trade, Principal principal) {
    trade.setUserID(principal.getName());
    logger.debug("Trade: " + trade);
    this.tradeService.executeTrade(trade);
}

我正在发送一个JSON字符串消息,该消息使用与服务器方法接受的相同的MarketOrderRequest POJO构建。与一些键:值对设置为空(但仍然存在)。

WebSocketConfig类配置了以下端点:

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/queue/", "/topic/");
    registry.setApplicationDestinationPrefixes("/app");
}

当我尝试使用以下代码向messagemapping发送消息时:

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.

服务器代码是从这个项目中提取的,并稍微改变以适应我的需要:link

我在AbstractSecurityWebSocketMessageBrokerConfigurer实现类中添加了一些基于角色的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或Principal参数,似乎存在查找方法的问题。我正在发送正确的对象类型,所以这可能是用户主体的问题吗?由于

我的WebSocketConfig类中有一个错误。

@componentscan注释有错误的包名。我将名称更新为正确的值(基本包的名称,例如"com.my")。项目")。现在,在日志中的部署期间,我可以看到控制器资源被映射到类中的方法。

一个方法的日志输出:

映射"{[/order],messageType=[MESSAGE]}"到公共void com.my.project.web.PortfolioController.executeOrder(tradeObjects.OrderRequest,java.security.Principal)

相关内容

  • 没有找到相关文章

最新更新