阿里巴巴 Rsocket - MonoContextWrite 无法转换为 java.lang.Integer 类
Posted
技术标签:
【中文标题】阿里巴巴 Rsocket - MonoContextWrite 无法转换为 java.lang.Integer 类【英文标题】:Alibaba Rsocket - MonoContextWrite cannot be cast to class java.lang.Integer 【发布时间】:2021-12-18 14:04:15 【问题描述】:我用的是阿里巴巴的 Rsocket。我有带代码的代理服务:
public interface ExampleService
Mono<String> getMessage();
和实施:
@RSocketService(serviceInterface = ExampleService.class, encoding = "json")
@Service
@RequiredArgsConstructor
public class ExampleServiceImpl implements ExampleService
@Override
public Mono<String> getMessage()
return Mono.just(response);
和客户服务(其他spring app):
public interface ExampleService
Mono<String> getMessage();
@Configuration
public class RSocketConfig
@Bean
public ExampleService exampleService(@Autowired UpstreamManager upstreamManager)
return RSocketRemoteServiceBuilder
.client(ExampleService.class)
.service("com.example.rsocket.ExampleService")
.upstreamManager(upstreamManager)
.acceptEncodingType(RSocketMimeType.Json)
.build();
当我在 Controller 中注入 ExampleService 的 Bean 并使用 getMessage() 方法时,我得到了异常:
Caused by: java.lang.ClassCastException: class reactor.core.publisher.MonoContextWrite cannot be cast to class java.lang.Integer (reactor.core.publisher.MonoContextWrite is in unnamed module of loader 'app'; java.lang.Integer is in module java.base of loader 'bootstrap')
什么原因?
【问题讨论】:
【参考方案1】:是的,这是由忽略 hashCode、equals、toString 方法的 InvocationHandler 引起的错误。
在代理实例上的 java.lang.Object 中声明的 hashCode、equals 或 toString 方法的调用将被编码并分派到调用处理程序的调用方法,其方式与接口方法调用的编码和分派方式相同,如如上所述。传递给调用的 Method 对象的声明类将是 java.lang.Object。从 java.lang.Object 继承的代理实例的其他公共方法不会被代理类覆盖,因此这些方法的调用行为与它们对 java.lang.Object 实例的行为类似。
1.1.2版本已修复,请参考 https://github.com/alibaba/alibaba-rsocket-broker/issues/174了解详情。
【讨论】:
以上是关于阿里巴巴 Rsocket - MonoContextWrite 无法转换为 java.lang.Integer 类的主要内容,如果未能解决你的问题,请参考以下文章
阿里巴巴 Rsocket - MonoContextWrite 无法转换为 java.lang.Integer 类
NetfiFacebook阿里等公司共同力推“响应式编程”技术:Rsocket
Spring RSocket:基于服务注册发现的 RSocket 负载均衡