Feign远程调用传递对象参数并返回自定义分页数据的方法
导读:本文共5032.5字符,通常情况下阅读需要17分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: Feign介绍Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用。Feign测试1.在yml文件里面增加了配置信息feign:httpclient:enabled:true2.在客户端pom.xml文件中引入的依赖(消费... ...
目录
(为您整理了一些要点),点击可以直达。Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用。
此处注意
此处依赖为什么使用io.github.openfeign的httpclient,而不使用Apache 的HttpClient替换Feign原生httpclient。
看了很多文章,都是说引用这个依赖:
但是不知道哪里的问题,在获取返回结果时一直报错:
Caused by: java.lang.NoSuchMethodError: feign.Response.create(ILjava/lang/String;Ljava/util/Map;Lfeign/Response$Body;)Lfeign/Response;
查看源码得知,openfeign在接受返回值时调用的不是httpclient的feign-core包的代码而是调用的本身的feign-core的代码,而本身的feign-core包中的Response类没有create方法。两个feign-core包中的Retryer接口不一致导致的,openfeign的feign-core版本为10.1.0 httpclient的版本为8.16.1。
找了半天问题,最后就把httpclient的依赖换成代码块中的依赖就OK了。
此处使用POST请求,第6步有解释。
我的TourismAdQuery类继承了Page类(似乎没有影响)
此处@PostMapping地址为服务端提供的api接口地址
此处传进来的参数是一个POJO类,如果不使用@RequestBody注解 的话,feign远程调用时参数是无法被接收到的。
虽然获取数据时,大多数使用 Get请求方法,但是GET方法无法接收@RequestBody参数体。
所以只好改GET请求为POST请求。
调用接口http://localhost:9009/list/ad/allByQuery 传递json格式参数即可:
成功分页获取数据 自定义的返回类型数据:
接口定义:
服务消费方调用报错:
Method has too many Body parameters: public abstract com.xingren.common.data.JsonResult com.xingren.xxx.yyy.contract.api.controller.ISessionController.querySessions(com.xingren.xxx.yyy.contract.qo.SessionsQo,org.springframework.data.domain.Pageable)
通过搜索、调研,目前有三种解决方法:
1、将分页属性直接通过入参传递,接口定义如下:
2、将分页对象冗余在Qo中(通过继承实现):
3、通过注解传递(参考:Issue):
服务提供方定义注解:
服务提供方定义接口:
服务消费方定义processor:
服务消费方自定义PageableUtil:
定义PageableUtil原因:主要是因为Feign对QueryMap类型参数的序列化和反序列化的言七墨方式与Sort.Order的不兼容,导致排序失效。
服务消费方调用方式:
Feign远程调用传递对象参数并返回自定义分页数据的方法的详细内容,希望对您有所帮助,信息来源于网络。