精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Feign的一個注解居然隱藏這么多知識!

開發 架構
最近由于業務的需要,需要接入下阿里云的一個接口,打開文檔看了看這個接口看下來還是比簡單的目測個把小時就可以搞定,但是接入的過程還是比較坎坷的。

[[426352]]

引言

最近由于業務的需要,需要接入下阿里云的一個接口,打開文檔看了看這個接口看下來還是比簡單的目測個把小時就可以搞定,但是接入的過程還是比較坎坷的。首先我看了看他給的示例,首先把阿里云文檔推薦的demo下載下來,把它的例子跑起來,替換下幾個必要的參數比如秘鑰啥的。這些秘鑰一般公司都會有專職的人員與阿里云去對接,你只要負責管他要就行了。

不過也不排除也有得公司需要自己去對接阿里云。說到這里就想吐槽下,對接阿里云的時候技術支持群居然是釘釘,所以需要他們的支持就必須要下載個釘釘, 電腦上莫名的有需要多裝一個軟件。扯遠了我們還是回到正題,把它demo下載下來,然后把對應的秘鑰等參數替換下,然后運行下demo看看是否能夠正常返回結果,做這一步主要是為了保證產品給過來的秘鑰等參數是否正確。如果能夠掉通接口,那就說明參數沒啥問題的接著我們就可以著手來寫業務代碼了。

接入阿里云二要素認證https://market.aliyun.com/products/57000002/cmapi029454.html?spm=5176.10695662.1194487.1.60066c190NsSkZ#sku=yuncode2345400003 把官網的demo下載下來跑起來看看,官網給出的例子還是比較簡單粗暴的,就是封裝了一個Apache的httplcient工具類一大坨的代碼,個人還是習慣性的使用feign來進行調用,因為feign的代碼干凈整潔,雖然底層也是通過HttpClient來實現,但是實現對我來說是無感的,畢竟業務代碼看起來干凈整潔。它的demo如下:

  1. public static void main(String[] args) { 
  2.      String host = "https://safrvcert.market.alicloudapi.com"
  3.      String path = "/safrv_2meta_id_name/"
  4.      String method = "GET"
  5.      String appcode = "你自己的AppCode"
  6.      Map<String, String> headers = new HashMap<String, String>(); 
  7.      //最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105 
  8.      headers.put("Authorization""APPCODE " + appcode); 
  9.      Map<String, String> querys = new HashMap<String, String>(); 
  10.      querys.put("__userId""__userId"); 
  11.      querys.put("customerID""customerID"); 
  12.      querys.put("identifyNum""identifyNum"); 
  13.             querys.put("identifyNumMd5""identifyNumMd5"); 
  14.      querys.put("userName""userName"); 
  15.      querys.put("verifyKey""verifyKey"); 
  16.  
  17.  
  18.      try { 
  19.       /** 
  20.       * 重要提示如下: 
  21.       * HttpUtils請從 
  22.       * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java 
  23.       * 下載 
  24.       * 
  25.       * 相應的依賴請參照 
  26.       * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml 
  27.       */ 
  28.       HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys); 
  29.       //錯誤信息見X-Ca-Error-Message字段 
  30.                 System.out.println(response.toString()); 
  31.       //獲取response的body 
  32.       System.out.println(EntityUtils.toString(response.getEntity())); 
  33.      } catch (Exception e) { 
  34.       e.printStackTrace(); 
  35.      } 
  36.  } 
  1. HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys); 

根據它提供的代碼我們可以看出來他是用一個httpUtils 類來實現http請求的,我們可以把這個httpClient類 替換成我們的FeignClient替換后的代碼如下:

  1. @FeignClient(name = "verifyIdCardAndNameFeignClient", url = "https://safrvcert.market.alicloudapi.com"
  2. public interface VerifyIdCardAndNameFeignClient { 
  3.     @RequestMapping(value = "/safrv_2meta_id_name/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 
  4.     Response verifyIdCardAndNameMap(@RequestParam Map<String,String> app, @RequestHeader("Authorization") String authorization); 

相對比較下來下面這個HttpClientUtils代碼是不是比較簡潔

按照這個demo功能確實是實現了,說實話個人還是不是很喜歡用map來作為參數,map作為入參的話,參數全靠猜可讀性以及可維護性有點差,個人還是習慣性的封裝一個javaBean作為實體。阿里文檔其實也有提到一嘴,雖然他只說到數據查詢這一層。

下面我們就修改下請求參數把它改成一個javaBean,改變后的代碼

  1. @RequestMapping(value = "/safrv_2meta_id_name/", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 
  2. Response verifyIdCardAndNameDTO(@RequestBody AliyunVerifyIdCardAndNameReq app, @RequestHeader("Authorization") String authorization); 

請求并沒有成功,根據報錯返回的信息看下來應該是沒有接受到參數。我們是GET請求的方式然后參數傳遞的是實體導致沒有接收到。feignClient不支持get方式傳遞實體類嗎?后來經過查詢資料發現了一個注解@SpringQueryMap 我們把上述代碼@RequestBody替換成@SpringQueryMap完美解決這個問題

@SpringQueryMap

在spring cloud 2.1.x 以上的版本,提供了一個新的注解@SpringQueryMap,為何這個注解可以幫我們實現。源碼之下無秘密,我們可以翻翻feign的源碼相對來說應該是比較簡單的,我們可以簡單的來看下源碼。看源碼是不是也不知道從哪里看起,從頭看到尾肯定也不現實, 不從頭開始看,又不知道源碼在哪里,有個很簡單的方法我們直接拿著這個注解全局搜一下,看看有哪些地方使用到了,在每個地方都打上一個斷點試試

我們全局搜下發現使用的地方主要在QueryMapParameterProcessor這個類里面。所以我們可以在這個類里面打上一個斷點試試。

  1. /** 
  2.  * {@link SpringQueryMap} parameter processor. 
  3.  * 
  4.  * @author Aram Peres 
  5.  * @see AnnotatedParameterProcessor 
  6.  */ 
  7. public class QueryMapParameterProcessor implements AnnotatedParameterProcessor { 
  8.  
  9.  private static final Class<SpringQueryMap> ANNOTATION = SpringQueryMap.class; 
  10.  
  11.  @Override 
  12.  public Class<? extends Annotation> getAnnotationType() { 
  13.   return ANNOTATION; 
  14.  } 
  15.  
  16.  @Override 
  17.  public boolean processArgument(AnnotatedParameterContext context, Annotation annotation, Method method) { 
  18.   int paramIndex = context.getParameterIndex(); 
  19.   MethodMetadata metadata = context.getMethodMetadata(); 
  20.   if (metadata.queryMapIndex() == null) { 
  21.    metadata.queryMapIndex(paramIndex); 
  22.    metadata.queryMapEncoded(SpringQueryMap.class.cast(annotation).encoded()); 
  23.   } 
  24.   return true
  25.  } 

我們發現打這個類的話在容器啟動的時候會進行加載,并且會執行processArgument方法,這個我們先不管這個方法,接下來我們來看看 Feign真正發起調用的地方找到SynchronousMethodHandler#invoke方法

  1. public RequestTemplate create(Object[] argv) { 
  2.  ... 省略部分代碼 
  3.  // metadata.queryMapIndex() 就是QueryMapParameterProcessor #processArgument方法賦值的 
  4.       if (metadata.queryMapIndex() != null) { 
  5.         // add query map parameters after initial resolve so that they take 
  6.         // precedence over any predefined values 
  7.         // 通過下標獲取到需要特殊處理的對象,這里有個問題只會處理方法參數的第一個@SpringQueryMap注解, 
  8.         // 原因就是QueryMapParameterProcessor #processArgument這個方法只會把第一個下標賦值進去,然后這里也只會取第一個下標,所以只會處理第一個@SpringQueryMap注解 
  9.         Object value = argv[metadata.queryMapIndex()]; 
  10.         //將對象轉換為map  這里需要注意下默認使用解析參數的是FieldQueryMapEncoder類所以它并不會去解析父類的參數,如果需要解析父類的參數我們需要在feign的Config里面指定QueryMapEncoder為FieldQueryMapEncoder 
  11.         Map<String, Object> queryMap = toQueryMap(value); 
  12.         //拼接解析完成的對象為URL參數 
  13.         template = addQueryMapQueryParameters(queryMap, template); 
  14.       } 
  15. ... 省略部分代碼 

上述代碼邏輯還是挺好理解的

  • 首先去判斷是否需要處理下querymap
  • 通過下標獲取到需要特殊處理的對象
  • 將對象轉換為map(這里有個坑默認不會去解析父類的字段)
  • 拼接追加map到url中

總結

上面通過@SpringQueryMap注解實現了get傳參,但是如果需要傳遞多個@SpringQueryMap注解我們可以怎么來實現呢?

或者我們可以自己動手來實現一個我們自己的SpringQueryMap,我們該如何實現?

@SpringQueryMap注解默認是不會去解析父類的參數,如果需要解析父類的參數需要修改Feign的config# QueryMapEncoder為FieldQueryMapEncoder。

如果我們自己去實現了一個AnnotatedParameterProcessor所有默認的PathVariableParameterProcessor、RequestParamParameterProcessor、RequestHeaderParameterProcessor、QueryMapParameterProcessor都會失效,為啥會失效我們去看看SpringMvcContract這個類。所以自定義AnnotatedParameterProcessor需要慎重。

結束

由于自己才疏學淺,難免會有紕漏,假如你發現了錯誤的地方,還望留言給我指出來,我會對其加以修正。

如果你覺得文章還不錯,你的轉發、分享、贊賞、點贊、留言就是對我最大的鼓勵。

感謝您的閱讀,十分歡迎并感謝您的關注。

本文轉載自微信公眾號「java金融」,可以通過以下二維碼關注。轉載本文請聯系java金融公眾號。

 

責任編輯:武曉燕 來源: java金融
相關推薦

2024-04-02 08:41:10

ArrayListSubList場景

2021-08-06 16:57:39

存儲Redis數據類型

2022-09-21 10:45:42

局域網Mesh網絡結構

2022-09-27 10:52:25

Pythonprint函數

2020-04-07 19:16:31

微信隱藏功能移動應用

2021-05-27 07:54:21

JavaStateAQS

2025-07-23 10:13:57

2021-05-03 23:41:42

微信功能知識

2021-01-14 10:24:55

壓縮集合方式

2017-08-11 14:21:33

軟件開發前端框架

2023-07-17 08:21:52

漏洞版本項目

2018-12-11 12:58:20

CPU散熱器鰭片

2020-11-20 10:22:34

代碼規范設計

2022-05-29 08:54:44

Edge瀏覽器

2023-07-26 00:32:33

注解抽象spring

2021-05-11 07:42:59

BeanSpring屬性

2024-07-12 09:35:38

前端工具檢驗

2018-06-26 15:00:24

Docker安全風險

2021-06-05 07:33:09

ID分布式架構

2023-11-13 08:49:54

點贊
收藏

51CTO技術棧公眾號

小小影院久久| 91成人在线| 久久亚洲影视婷婷| 国产精品伦子伦免费视频| 色偷偷男人天堂| 国产精品麻豆| 日韩欧美极品在线观看| 亚洲一区二区三区加勒比| 国产夫妻在线观看| 亚洲一区网站| 欧美人成在线视频| 免费网站在线高清观看| 136导航精品福利| 欧美午夜精品久久久久久人妖| 图片区小说区区亚洲五月| 成人小说亚洲一区二区三区 | 国产亚洲欧美一级| 亚洲自拍偷拍网址| 无码日韩精品一区二区| 国产精品a级| 在线电影av不卡网址| 男男一级淫片免费播放| 亚洲最大的免费视频网站| 午夜精彩视频在线观看不卡| 特色特色大片在线| 91啦中文在线| 久久一二三国产| 九色视频成人porny| av一级黄色片| 精品一区二区三区视频在线观看| 青青草成人在线| 久久精品国产亚洲av无码娇色| 日韩三级在线| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品激情视频| 一区二区三区四区视频免费观看| 欧美人与性动xxxx| 宅男噜噜噜66国产免费观看| 久草在线中文最新视频| 亚洲国产精品自拍| 男人添女人下部视频免费| 高清全集视频免费在线| 国产精品色呦呦| 亚洲精品一品区二品区三品区| 亚洲欧美日韩精品永久在线| 成人黄色777网| 岛国一区二区三区高清视频| 国产国语亲子伦亲子| 韩日av一区二区| 国产欧美一区二区白浆黑人| 国产精品传媒在线观看| 三级成人在线视频| 国产精品久久二区| 中文字幕一区二区免费| 毛片不卡一区二区| 成人免费视频a| 国产精品毛片久久久久久久av| 美国欧美日韩国产在线播放 | 九九九九九九精品任你躁| 欧美日本精品一区二区三区| 成人日韩在线视频| www.欧美视频| 欧美电影免费提供在线观看| 911亚洲精选| 北条麻妃一区二区三区在线观看| 精品国产百合女同互慰| 91视频啊啊啊| 精品国产午夜| 日日噜噜噜夜夜爽亚洲精品| 欧美丰满熟妇bbbbbb| 国产精品观看| 91精品国产91久久久久久| 亚洲精品成人在线视频| 日本亚洲免费观看| 亚洲综合日韩中文字幕v在线| av老司机久久| 91在线视频在线| 日韩国产一区久久| 毛片在线播放a| 亚洲一级在线观看| 国产第一页视频| 四虎影视精品永久在线观看| 精品乱人伦小说| 久久精品国产亚洲av久| 欧美www视频在线观看| 欧美成人午夜剧场免费观看| 成人免费视频毛片| 久热成人在线视频| 国产丝袜不卡| youjizz在线播放| 亚洲一区二区三区三| 北条麻妃在线观看| 男女啪啪999亚洲精品| 欧美成人综合网站| 午夜精产品一区二区在线观看的| 99九九热只有国产精品| 久久久女女女女999久久| 日日噜噜噜噜人人爽亚洲精品| 国精产品一区一区三区mba桃花 | 一个人看的视频www| 欧美性生活一级片| 久久夜精品va视频免费观看| 久久国产精品免费看| 狠狠狠色丁香婷婷综合激情 | 精品高清美女精品国产区| 免费看污污网站| 国产精品网站在线看| 在线日韩第一页| 国产欧美日韩另类| 国产乱码字幕精品高清av| 日本不卡一区二区三区视频| 欧美xxxx免费虐| 欧美日韩一级二级三级| 日韩精品卡通动漫网站| 欧美一区成人| 国产精品影片在线观看| 天堂а在线中文在线无限看推荐| 亚洲精品国产视频| 色悠悠久久综合网| 自拍视频一区| 91精品国产高清久久久久久91| 国产女人高潮毛片| 中文字幕一区在线观看视频| 北条麻妃视频在线| 欧美人成在线观看ccc36| 欧美成人一二三| 91尤物国产福利在线观看| 久久午夜羞羞影院免费观看| www.av毛片| 99精品在免费线中文字幕网站一区 | 性欧美疯狂xxxxbbbb| 污污视频在线免费| 午夜av一区| 成人福利视频在线观看| 成人jjav| 欧洲精品视频在线观看| 97超碰在线资源| 免费视频一区二区三区在线观看| 国产日韩欧美亚洲一区| segui88久久综合9999| 精品国产三级电影在线观看| 欧美日韩免费做爰视频| 国产一区亚洲一区| 黄黄视频在线观看| 精品视频一区二区三区| 不卡av电影院| www久久久com| 亚洲国产一区二区在线播放| 熟女人妻一区二区三区免费看| 欧美韩日精品| 成人在线视频电影| 福利在线免费视频| 亚洲激情成人网| 西西44rtwww国产精品| 91亚洲精品一区二区乱码| 9久久9毛片又大又硬又粗| 美女午夜精品| 日韩免费av在线| 91精品国产91久久久久游泳池| 欧美三日本三级三级在线播放| 国产精品成人在线视频| 精品一区二区三区在线观看| 精品久久免费观看| 国产精品日本一区二区三区在线 | 四虎免费在线视频| 国产99精品视频| 国产高清精品在线观看| 精品视频免费| 亚洲一区二区三区777| 久久香蕉一区| 日韩精品福利在线| 国内av在线播放| 亚洲免费观看视频| 中文字幕天堂av| 久久久成人网| 在线播放 亚洲| 韩国女主播一区二区三区| 欧美诱惑福利视频| av国产在线观看| 欧美大片拔萝卜| 国产精品久久久久久人| 国产精品乱码人人做人人爱| 日韩av影视大全| 国产精品婷婷| 手机福利在线视频| 天天做夜夜做人人爱精品 | 99久久国产热无码精品免费| 午夜影院久久久| 91视频免费看片| 成人不卡免费av| 欧美三级午夜理伦三级富婆| 欧美成人嫩草网站| 欧美日韩在线播放一区二区| 韩国三级成人在线| 欧美影院久久久| 91高清在线观看视频| 亚洲色图综合久久| 成人h动漫精品一区二区无码| 一本一道波多野结衣一区二区| 性色国产成人久久久精品| 成a人片亚洲日本久久| 成人免费在线观看视频网站| 国产日韩欧美高清免费| 男女啪啪免费观看| 日韩av密桃| 久久精品人人做人人爽电影| 国产区一区二| 国产精品美女在线观看| 黄视频网站在线观看| 久久久av免费| 成人精品福利| 精品无人区乱码1区2区3区在线| 国产婷婷一区二区三区久久| 91成人在线免费观看| 精品无码一区二区三区电影桃花| 国产精品视频一二三| 一级特级黄色片| 国产69精品久久777的优势| 在线不卡一区二区三区| 水野朝阳av一区二区三区| 91动漫在线看| 亚洲精品在线观看91| 亚洲高清在线观看一区| 亚洲精品无吗| 黑人巨大精品欧美一区二区小视频| 99综合久久| 成人黄色片在线| 国产精品天堂蜜av在线播放| 国产精品九九九| 午夜av成人| 国产福利视频一区| 中文字幕色婷婷在线视频| 97国产在线观看| aa视频在线观看| 久久久久久久影院| 色综合999| 欧美人与性动交| av毛片在线播放| 久久精品国产欧美激情| 在线观看免费版| xvideos亚洲人网站| 在线视频91p| 日韩亚洲欧美中文高清在线| 色哟哟免费在线观看| 日韩在线观看免费全| 日本不卡不卡| 久久中文字幕国产| 成人黄色网址| 欧美大片免费观看在线观看网站推荐| 成人看av片| 欧美激情国产日韩精品一区18| а√天堂在线官网| 色综合久久久久久中文网| 欧美卡一卡二| 97av在线播放| 日韩免费电影| 成人高清视频观看www| 国内精品视频| 国产一区二区三区奇米久涩| 日韩中出av| 天天综合狠狠精品| 亚洲国产一区二区在线观看 | 午夜dj在线观看高清视频完整版 | 免费在线黄色片| 午夜激情综合网| 国产女主播喷水视频在线观看| 欧美午夜精品久久久| 国产乱色精品成人免费视频 | 精品人伦一区二区三区蜜桃网站 | 日本成人在线视频网站| 污视频网址在线观看| 国产成人午夜99999| 三级黄色片网站| 国产欧美日韩在线| 手机在线免费看毛片| 偷拍一区二区三区| 自拍偷拍精品视频| 欧美一级片免费看| 天天干,天天操,天天射| 国产一区二区精品丝袜| 成视频免费观看在线看| 91av视频在线| 亚洲精品成a人ⅴ香蕉片| 国产a一区二区| 精品美女久久| 日本免费成人网| 日韩影院在线观看| wwwww在线观看| 欧美激情综合在线| 久久久久久久久精| 色网站国产精品| 成人av一区二区三区在线观看| 亚洲欧洲在线免费| 日本性爱视频在线观看| 国产精品福利在线| caoporn成人| 亚洲一区二区三区四区中文| 精品1区2区3区4区| 杨幂毛片午夜性生毛片| 成av人片一区二区| 99热6这里只有精品| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 一本色道久久综合亚洲精品图片| 中文字幕视频一区| 欧美精品韩国精品| 欧美xxx久久| 日本免费中文字幕在线| 欧亚精品中文字幕| www.亚洲一二| 2025韩国大尺度电影| 久久五月激情| 熟妇人妻久久中文字幕| 亚洲人午夜精品天堂一二香蕉| www.久久精品视频| 亚洲国产成人av在线| av毛片在线播放| 国产美女精彩久久| 精品国产乱码久久久久久蜜坠欲下 | 在线观看免费黄视频| 日本久久91av| 台湾色综合娱乐中文网| av一区二区三区免费观看| 久久99精品网久久| 2019男人天堂| 一本大道av伊人久久综合| 日韩性xxxx| 欧美高清性猛交| 免费看日产一区二区三区| 91香蕉视频网址| 精品一区二区三区久久| avhd101老司机| 欧美性色综合网| 免费一级在线观看播放网址| 7777免费精品视频| 久久精品66| 狠狠97人人婷婷五月| 成人av网站在线| 日韩污视频在线观看| 精品国产免费久久| 久久香蕉一区| 韩国成人一区| 亚洲一区不卡| 中文字幕一区二区三区人妻电影| 欧美日韩人人澡狠狠躁视频| 污视频网站免费观看| 97超级碰在线看视频免费在线看| 黄色免费大全亚洲| 99视频在线免费播放| 91麻豆免费看片| 综合网在线观看| 在线观看日韩视频| 久久精品 人人爱| 午夜久久久久久久久久久| 国产精品1区2区| 国产精选第一页| 亚洲精品按摩视频| 91av亚洲| 亚洲欧美日韩另类精品一区二区三区| 麻豆91在线观看| 免费在线黄色网| 亚洲激情国产精品| 黄色漫画在线免费看| 日本中文不卡| 久久成人免费电影| 九九视频免费看| 亚洲国产欧美久久| 蜜桃视频成人m3u8| 欧洲xxxxx| av电影天堂一区二区在线| 久久国产乱子伦精品| 久久好看免费视频| youjizz亚洲| 青青草av网站| 亚洲欧美日韩小说| 污污视频在线免费看| 国产精品久久99久久| 综合久久婷婷| 欧洲一级黄色片| 欧美日韩国产在线播放网站| 青草av在线| 日本一区免费| 国产精品中文字幕日韩精品| 欧美精品亚洲精品日韩精品| 亚洲视频自拍偷拍| 日韩在线成人| 日韩精品一区中文字幕| 一区二区三区四区五区视频在线观看| 神马久久精品| 91久久综合亚洲鲁鲁五月天| 在线视频精品| 日本爱爱小视频| 日韩av有码在线| 免费看日产一区二区三区| 久久久久狠狠高潮亚洲精品| 亚洲私人影院在线观看| 日韩成人黄色| 91超碰rencao97精品| 日韩黄色小视频| 精品无码一区二区三区电影桃花| 中文字幕久久亚洲|