欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

feign调用返回object类型转换方式

程序员文章站 2022-03-13 07:56:00
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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。