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

Posted

技术标签:

【中文标题】MessageMapping 处理程序 - 没有匹配的方法【英文标题】:MessageMapping Handler - No matching methods 【发布时间】:2015-08-11 11:08:04 【问题描述】:

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

@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(但仍然存在)的 Key:Value 对。

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.

服务器代码是从这个项目中提取的,并根据我的需要稍作修改: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 参数,查找方法似乎存在问题。我正在发送正确的对象类型,所以这可能是用户主体的问题吗?谢谢

【问题讨论】:

【参考方案1】:

我的 WebSocketConfig 类中有一个错误。

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

例如一种方法的日志输出:

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

【讨论】:

感谢您提供示例日志输出。它帮助我意识到我的日志中缺少什么。

以上是关于MessageMapping 处理程序 - 没有匹配的方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud - SQS

Vue为啥可以成为2019年的一匹黑马?

百马百驮问题,大马可驮3批货,中马2批,两匹小马一批货,大马中马小马各多少匹

正则表达式必知必会

遇见未来 | PostgreSQL:一匹即将发力的黑马

leofs 对象存储中一匹黑马