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

解决feignClient调用时获取返回对象类型匹配的问题

程序员文章站 2022-03-11 12:25:42
feignclient调用时获取返回对象类型匹配feignclient是springcloud体系中重要的一个组件,用于微服务之间的相互调用,底层为httpclient,在之前的应用中,我一直以为a服...

feignclient调用时获取返回对象类型匹配

feignclient是springcloud体系中重要的一个组件,用于微服务之间的相互调用,底层为httpclient,在之前的应用中,我一直以为a服务提供的方法返回类型为对象的话,那么调用a服务的b服务必须也用字段类型以及命名完全相同的对象来接收,为此我验证了一下,发现不是必须用完全相同的对象来接收,比如,可以用map<string,object>或者object来接收,然后解析。

当然,复杂对象我还是推荐用一个完全相同的对象来接收。

下面是我的例子:

feignclient是springcloud体系中重要的一个组件,用于微服务之间的相互调用,底层为httpclient,在之前的应用中,我一直以为a服务提供的方法返回类型为对象的话,那么调用a服务的b服务必须也用字段类型以及命名完全相同的对象来接收,为此我验证了一下,发现不是必须用完全相同的对象来接收,比如,可以用map<string,object>或者object来接收,然后解析。

当然,复杂对象我还是推荐用一个完全相同的对象来接收。

下面是我的例子:

项目一:首先创建一个服务注册中心eureka

解决feignClient调用时获取返回对象类型匹配的问题

配置文件

解决feignClient调用时获取返回对象类型匹配的问题

项目二:紧接着创建一个服务提供方eureka-client,方法helloworld返回值为map

解决feignClient调用时获取返回对象类型匹配的问题

注册到eureka中

解决feignClient调用时获取返回对象类型匹配的问题

项目三:创建服务调用方service-feign

解决feignClient调用时获取返回对象类型匹配的问题

解决feignClient调用时获取返回对象类型匹配的问题

注意:map的key与hello类字段属性对应

解决feignClient调用时获取返回对象类型匹配的问题

注册到eureka

解决feignClient调用时获取返回对象类型匹配的问题

最后:启动三个项目

解决feignClient调用时获取返回对象类型匹配的问题

发现项目二 项目三已经被注册到服务中心

调用项目三的接口

解决feignClient调用时获取返回对象类型匹配的问题

可以正常返回,由于项目二返回类型是map.而项目三是用对象hello来接收的,那么就说明了服务提供方的返回值类型和调用方接收值类型并不是需要完全对应的。

feignclient传参(参数为对象类型)的一个坑

客户端

@requestmapping(value = "/friendcirclecomment/comment",method = requestmethod.post)
r comment(@requestbody friendcirclecomment friendcirclecomment);

服务端

@requestmapping(value = "/comment")
public r comment(@requestbody friendcirclecomment friendcirclecomment){
  friendcirclecommentservice.comment(friendcirclecomment);
  return new r();
}

这么传参是没问题的,服务端也能接收到

但是,问题来了,

小程序的post请求的header必须为

header:{ 'content-type':'application/x-www-form-urlencoded'  }, 

导致后台为@requestbody接收不到参数,

feignclient默认参数请求类型是

header:{ 'content-type':'application/json'  }, 

定义@requestbody接收参数的headers类型必须为

header:{ 'content-type':'application/json'  }, 

所以这样就有冲突,feignclient和定义为'content-type':'application/x-www-form-urlencoded'的请求接口不能共用

解决方法

不使用对象接收,使用基本类型接收

如下

客户端

@requestmapping(value = "/friendcirclecomment/comment",method = requestmethod.post)
r comment(@requestparam(value = "friendcircleid",required = false)integer friendcircleid,
            @requestparam(value = "memberid",required = false)integer memberid,
            @requestparam(value = "parentid",required = false)integer parentid,
            @requestparam(value = "comment",required = false)string comment,
            @requestparam(value = "replymemberid",required = false)integer replymemberid);

服务端

 @requestmapping(value = "/comment")
 public r comment(@requestparam(value = "friendcircleid",required = false)integer friendcircleid,
                  @requestparam(value = "memberid",required = false)integer memberid,
                  @requestparam(value = "parentid",required = false)integer parentid,
                  @requestparam(value = "comment",required = false)string comment,
                  @requestparam(value = "replymemberid",required = false)integer replymemberid
                  ){
  friendcirclecomment friendcirclecomment = new friendcirclecomment();
  friendcirclecomment.setfriendcircleid(friendcircleid);
  friendcirclecomment.setmemberid(memberid);
  friendcirclecomment.setparentid(parentid);
  friendcirclecomment.setcomment(comment);
  friendcirclecomment.setreplymemberid(replymemberid);
  friendcirclecommentservice.comment(friendcirclecomment);
  return new r();
}

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