gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:48:28 26 4
gpt4 key购买 nike

我有一个带有 @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);
}

我正在发送一条 JSON 字符串消息,该消息使用与服务器方法接受的相同的 MarketOrderRequest POJO 构建。一些 Key:Value 对设置为 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.

服务器代码是从这个项目中提取出来的,并稍作改动以满足我的需要:link

我在 AbstractSecurityWebSocketMessageBrokerConfigurer 实现类中添加了一些基于角色的网络套接字安全性,如下所示:

@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.project”)。现在在日志中部署期间,我可以看到 Controller 资源被映射到我的类中的方法。

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

Mapped "{[/order],messageType=[MESSAGE]}" onto public void com.my.project.web.PortfolioController.executeOrder(tradeObjects.OrderRequest,java.security.Principal)

关于java - MessageMapping 处理程序 - 没有匹配的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31940129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com