feign调用返回object类型转换方式
程序员文章站
2022-06-26 09:26:56
feign调用返回object类型转换引入依赖 com.fasterxml.jackson.cor...
feign调用返回object类型转换
引入依赖
<dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-databind</artifactid> <version>2.9.8</version> </dependency>
/** * @description: 将数据转换到相应的容器 * @param bean * @param clazz * @return * @throws * @author dlh * @date 2019/3/19 10:28 */ public static <t> t convertvalue(object bean, class<t> clazz){ try{ objectmapper mapper = new objectmapper(); return mapper.convertvalue(bean, clazz); }catch(exception e){ logger.error("错误的转换:beanutil.convertvalue() --->" + e.getmessage()); return null; } }
springcloud feign接口转换服务
feign是通过提供面向接口操作的方式来替代resttemplate api的rest操作。
使用feign
feign这种技术应用在服务消费端
修改pom.xml配置文件,加入feign的依赖包
<dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-starter-feign</artifactid> </dependency>
由于fegin是将rest的操作转换成接口的形式,所以我们需要新建一个接口,并在接口上声明@feignclient注解
@feignclient(value = "dept-provider",configuration = feignclientconfig.class) public interface deptclientservice { @requestmapping(method= requestmethod.get,value="/dept/get/{id}") public dept get(@pathvariable("id") long id) ; @requestmapping(method=requestmethod.get,value="/dept/list") public list<dept> list() ; @requestmapping(method=requestmethod.post,value="/dept/add") public boolean add(dept dept) ; } @configuration public class feignclientconfig { @bean public logger.level getfeignloggerlevel() { return feign.logger.level.full ; } @bean public basicauthrequestinterceptor getbasicauthrequestinterceptor() { return new basicauthrequestinterceptor("admin", "admin"); } }
其中configuration = feignclientconfig.class不是必须的,将configuration属性去除仍然能work。
将之前的rest操作的api,替换成面向deptclientservice接口的形式
@restcontroller @requestmapping("/consumer/dept") public class consumerdeptcontroller { @autowired private deptclientservice deptclientservice; @requestmapping(value = "/get") public dept get(long id) { return this.deptclientservice.get(id); } @requestmapping("/list") public list<dept> list(){ return this.deptclientservice.list(); } @requestmapping("/add") public boolean add(dept dept){ return this.add(dept); } /* public static final string dept_get_url = "http://dept-provider/dept/get/"; public static final string dept_list_url = "http://dept-provider/dept/list/"; public static final string dept_add_url = "http://dept-provider/dept/add"; @autowired private resttemplate resttemplate; @autowired private httpheaders httpheaders; @autowired private loadbalancerclient loadbalancerclient; @requestmapping(value = "/get") public dept get(long id) { serviceinstance serviceinstance = this.loadbalancerclient.choose("dept-provider") ; system.out.println( "【*** serviceinstance ***】host = " + serviceinstance.gethost() + "、port = " + serviceinstance.getport() + "、serviceid = " + serviceinstance.getserviceid()); //dept dept = resttemplate.getforobject(dept_get_url + id, dept.class); dept dept = resttemplate.exchange(dept_get_url+id, httpmethod.get,new httpentity<object>(this.httpheaders),dept.class).getbody(); return dept; } @requestmapping("/list") public list<dept> list(){ //list<dept> deptlist = resttemplate.getforobject(dept_list_url, list.class); list<dept> deptlist = this.resttemplate.exchange(dept_list_url,httpmethod.get,new httpentity<object>(this.httpheaders),list.class).getbody(); return deptlist; } @requestmapping("/add") public boolean add(dept dept){ //boolean flag = resttemplate.postforobject(dept_add_url, dept, boolean.class); boolean flag = this.resttemplate.exchange(dept_add_url,httpmethod.post,new httpentity<object>(this.httpheaders),boolean.class).getbody(); return flag; }*/ }
在启动类中加入@enablefeignclients注解
@springbootapplication @enableeurekaclient @enablefeignclients(basepackages = {"cn.zgc.service"}) public class feignconsumer_80_startspringcloudapplication { public static void main(string[] args) { springapplication.run(feignconsumer_80_startspringcloudapplication.class,args); } }
feign自带了负责均衡特性,所以使用feign之后可以不用使用ribbon。
feign的配置
feign 最重要的功能就是将 rest 服务的信息转换为接口,但是在实际的使用之中也需要考虑到一些配置情况,例如:数据压缩, rest 的核心本质在于: json 数据传输( xml、文本),于是就必须思考一种情况,万一用户发送的数据很大呢? 所以这个时候可以考虑修改application.yml 配置文件对传输数据进行压缩;
feign: compression: request: mime-types: # 可以被压缩的类型 - text/xml - application/xml - application/json min-request-size: 2048 # 超过2048的字节进行压缩
开启feign的日志(默认是不开启的)
logging: level: cn.zgc.service: debug
feign调用的时候返回参数不是期望的数据类型
今天碰到个坑,feign调用其他应用的时候反参并不是期望的类型;不知道这个在其他请求方式有没有这个bug
解决的方法
是在feign调用的那里指定response<?>的泛型类,我这边是碰到期望是返回long类型,但是返回的是integer类型,不知道是不是隐式转换了,这里记录一下这个bug
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。