關於Feign在微服務間呼叫引用引數傳遞的問題

2021-10-02 04:27:41 字數 1851 閱讀 8997

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...