解決feignClient調用時獲取返回對象類型匹配的問題
feignClient調用時獲取返回對象類型匹配
feignClient是springCloud體系中重要的一個組件,用于微服務之間的相互調用,底層為httpClient,在之前的應用中,我一直以為A服務提供的方法返回類型為對象的話,那么調用A服務的B服務必須也用字段類型以及命名完全相同的對象來接收,為此我驗證了一下,發(fā)現不是必須用完全相同的對象來接收,比如,可以用map<String,Object>或者Object來接收,然后解析。
當然,復雜對象我還是推薦用一個完全相同的對象來接收。
下面是我的例子:
feignClient是springCloud體系中重要的一個組件,用于微服務之間的相互調用,底層為httpClient,在之前的應用中,我一直以為A服務提供的方法返回類型為對象的話,那么調用A服務的B服務必須也用字段類型以及命名完全相同的對象來接收,為此我驗證了一下,發(fā)現不是必須用完全相同的對象來接收,比如,可以用map<String,Object>或者Object來接收,然后解析。
當然,復雜對象我還是推薦用一個完全相同的對象來接收。
下面是我的例子:
項目一:首先創(chuàng)建一個服務注冊中心eureka
配置文件
項目二:緊接著創(chuàng)建一個服務提供方eureka-client,方法helloWorld返回值為map
注冊到eureka中
項目三:創(chuàng)建服務調用方service-feign
注意:map的key與Hello類字段屬性對應
注冊到eureka
最后:啟動三個項目
發(fā)現項目二 項目三已經被注冊到服務中心
調用項目三的接口
可以正常返回,由于項目二返回類型是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(); }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring Boot利用Thymeleaf發(fā)送Email的方法教程
spring Boot默認就是使用thymeleaf模板引擎的,下面這篇文章主要給大家介紹了關于在Spring Boot中利用Thymeleaf發(fā)送Email的方法教程,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。2017-08-08spring?cloud?eureka注冊原理-注冊失敗填坑筆記
這篇文章主要介紹了spring?cloud?eureka注冊原理-注冊失敗填坑筆記,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05RestTemplate響應中如何獲取輸入流InputStream
這篇文章主要介紹了RestTemplate響應中如何獲取輸入流InputStream問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01