RSocket端点访问异常求助:无目标处理器问题排查
解决RSocket端点访问异常:
No handler for destination '' 这个异常的核心原因很明确:你的客户端请求没有携带正确的路由元数据,导致服务器接收不到hello这个路由标识,自然找不到对应的@MessageMapping("hello")处理器。你怀疑RSocketRequester.wrap的配置问题是对的,问题就出在元数据MIME类型的设置上。
问题根源
Spring RSocket服务器默认使用message/x.rsocket.routing.v0作为路由元数据的专用MIME类型,用来识别@MessageMapping指定的路由。而你之前把元数据类型设为application/json,这会导致客户端无法正确编码route("hello")的路由信息,服务器拿到的就是空的destination,所以抛出异常。
另外,服务端开启的lazy-initialization: true也可能影响RSocket处理器的初始化,导致路由处理器没被加载,建议先关闭。
修复方案
方案一:推荐使用RSocketRequester.Builder构建(更简洁不易错)
直接用Spring提供的Builder来构建RSocketRequester,它会自动处理元数据编码和连接细节,不需要手动配置单独的RSocket bean:
@Bean RSocketRequester requester(RSocketStrategies strategies) { return RSocketRequester.builder() .rsocketStrategies(strategies) .dataMimeType(MimeTypeUtils.APPLICATION_JSON) .connectTcp("localhost", 7500) .block(); }
方案二:如果必须使用wrap方法
需要明确指定元数据MIME类型为路由专用的类型,并且搭配正确的处理策略:
import io.rsocket.metadata.WellKnownMimeType; import org.springframework.util.MimeType; @Bean RSocket rSocket() { return RSocketFactory.connect() .metadataMimeType(WellKnownMimeType.MESSAGE_RSOCKET_ROUTING.getString()) .dataMimeType(MimeTypeUtils.APPLICATION_JSON_VALUE) .frameDecoder(PayloadDecoder.ZERO_COPY) .transport(TcpClientTransport.create(new InetSocketAddress(7500))) .start() .block(); } @Bean RSocketRequester requester(RSocketStrategies strategies) { return RSocketRequester.wrap( rSocket(), MimeTypeUtils.APPLICATION_JSON, MimeType.valueOf(WellKnownMimeType.MESSAGE_RSOCKET_ROUTING.getString()), strategies ); }
服务端配置调整
关闭懒加载,确保RSocket处理器被正确初始化:
spring: rsocket: server: port: 7500 transport: tcp main: lazy-initialization: false
验证步骤
- 按照上述方案修改客户端代码
- 调整服务端yml配置
- 重启服务端和客户端,调用
/greet/{name}接口,应该能正常返回GreetingsResponse对象。
内容的提问来源于stack exchange,提问作者Roie Beck
相关产品推荐
相关产品推荐

