feign預設不支援get方式傳遞pojo,也不支援傳遞多個引用型別的引數!本文就是解決這兩個問題!
解決思路:
在微服務a端:將要傳遞的引用型別引數要麼以body方式傳遞,要麼以json串方式傳遞,在***裡解析json串拆分為更為詳細的引數。
在微服務b端:按照springmvc支援寫法去寫,a端傳來的請求引數自動對映到b端實體屬性上!
解決問題的關鍵:是自定義feign請求***的實現
關鍵**如下:
/**
* 處理feign請求不支援pojo的問題,以及引數為json串的轉換處理!
*/@allargsconstructor
@configuration
public class feignrequestinterceptor implements requestinterceptor
// 處理帶有@requestparam字首註解的引數解析,如果是json串則拆分處理
map> entityparams = template.queries();
if (entityparams.size() > 0) }}
template.queries(queries);
} catch (ioexception e) }}
...省略其他的**....
}
解決不能傳遞pojo的問題:
下面這段**處理:支援有乙個引數不寫@requestparam,這樣這個引用引數自動對映為body:即支援get傳遞pojo物件,例如分頁物件,***攔截處理!
map> queries = new hashmap<>();
// 處理不帶註解的引數解析
// feign 不支援 get 方法傳 pojo, json body轉query
if (template.requestbody().asbytes() != null)
例如,下面為feign介面中定義的樣例:
r getwarninginfopage(page page, @requestparam("warninginfo") string warninginfojsonstring, @requestheader(securityconstants.from) string from);
此處的page就會被***處理,以便支援傳遞到b端!
解決傳遞多個引用物件引數到b端的問題:
下面的這段**處理帶有@requestparam字首註解的引數解析,如果是json串則拆分處理:
// 處理帶有@requestparam字首註解的引數解析,如果是json串則拆分處理
map> entityparams = template.queries();
if (entityparams.size() > 0)
}}
在a端傳遞多個引用型別物件的json串,這樣就支援傳遞多個引用物件作為引數了,***會解析json串並拆分為請求引數;
下面為feign介面中定義的樣例,
r getwarninginfopage(@requestparam("page") string pagejsonstring, @requestparam("warninginfo") string warninginfojsonstring, @requestheader(securityconstants.from) string from)
b端按照springmvc支援的方式書寫即可:例如
@inner
public r getwarninginfopage(page page, warninginfo warninginfo)
參考:
Feign 微服務互相呼叫 概念
一 feign 1 基本概念 feign是netflix開發的宣告式 模板化的http客戶端,feign可以幫助我們更快捷 優雅地呼叫http api。feign支援多種註解,例如feign自帶的註解或者jax rs註解等。spring cloud對feign進行了增強,使feign支援了sprin...
微服務宣告式呼叫元件 Feign
宣告式rest客戶端 採用基於介面的註解方式 注意 是在服務呼叫方去宣告介面,然後跟服務提供方的api進行對應,這樣就可以呼叫了 org.springframework.cloud spring cloud starter openfeign 啟動類新增註解 enablefeignclients 此...
微服務消費端通過feign呼叫微服異常問題
在專案開發中,我們的呼叫方通過feign呼叫微服時,如果微服出現業務異常 例如空指標,或拋出自定義的異常 和非業務異常 引數不合法4xx異常 都會進入到呼叫方的全域性異常 丟擲的code全部轉換成了500,這樣不友好 實際上只有業務異常feign才會轉換成500錯誤且轉成feignexception...