做项目学习,使用RestTemplate远程调用,从order订单系统调用pay支付系统,出现使用@Request做远程接收。
代码的逻辑很简单,但就是没有接收到实体类
1. 猜想是不是没有序列化和初始化方法?
这个好排查,看Pay和PayDTO实体类是不是没有序列化,两个实体类都已实例化。
其实在Spring框架下,http传输对象是先将转成Json对象,之后json对象再转成二进制数据在网络传输,所以自定义的对象是不需要序列化的。
注意:数据在网络传输都需要序列化,自定义的类不需要序列化,是因为http将对象转成Json对象了。
2. 是不是没有传对象类?
(order系统)先看RestTemplate的方法postForObject将对象类存放到HTTP的什么地方。
(order系统)进行了httpEntityCallback方法。
(order系统)进入了HttpEntityRequestCallback方法。
(order系统)构建了HTTPEntity实体类。
(order系统)最后将对象类放入了body里。
(pay系统)所以可以在Request请求体的Body中获取到PayDTO的信息。因为直接断点Controller是获取不到Request的,所以需要构建拦截器对Request进行拦截。
(pay系统)但是在Request的请求中没有找到Body的信息。
因为SpringBoot使用的是tomcat服务器,所以去tomcat的官网找body的信息,在debug可以知道Request的实现类似是RequestFacade。
但在tomcat官网也没有找到body的属性,那就全局搜索,找到了getInputStream的方法获取body。
(pay系统) 在ServletInputStream中找到了对象,那么对象肯定传输过来了。
3. 注解和配置类有没有问题?
因为系统是新搭建的,所以配置类几乎没有,一下就排查完,不是配置类的问题。
那么就有可能是注解的问题的。经过排查,发现了用错了RequestBody的注解,使用到了swagger的RequestBody。
结论: 其实是引用错包了,用了swagger的RequestBody,正确应使用Springframework的。