spring cloud feign 坑

feign是啥?

不少人可能對於feign 不是很熟悉,能夠看一下其餘網友的實例分享:spring cloud feign簡介java

若是以爲上面這個比較難的話,還有一個簡單入門的:spring cploud feign使用詳解程序員

今天的主題是記錄遇到的坑,關於feign的資料網友分享已經很詳細,我就不班門弄斧啦啦web

feign 坑之@RequestParam參數名

此次在作一箇中臺項目(使用 spring boot),須要和市場上不少同行公司結合的那種,這就涉及到同個服務須要被不少外部服務調用的場景,以前一般都會用代理去實現對其餘外部服務的訪問,但代理模塊也須要寫不少代碼,對於懶惰的程序員而言,這固然是要想辦法簡化的(是誰說的,不會偷懶的程序員都不是好程序員來着?)spring

而後有大神推薦咱們使用了feign,Feign 是 Spring Cloud的組件,這裏就須要討論spring boot 和spring cloud 整合的問題了,可是不展開,能夠移步擴展閱讀。json

在依賴了 spring cloud以後,外部服務就能夠愉快的開始使用 feign來調用咱們的接口了api

@FeignClient(name = "${test-service.application.name}", configuration = TestServiceFeignConfig.class)
public interface TestServiceInterfaceClient extends TestServiceInterfaceApi{
}
TestServiceInterfaceApi 是咱們中臺內部實現的接口,接口定義以下:
/**
 * 版權全部(C),xxxx公司,2019,全部權利保留。
 * 
 * 項目名:    test-client-api
 * 文件名:    TestServiceApi.java
 * 模塊說明:    
 * 修改歷史:
 * 2019年6月20日 -ln- 建立。
 */
package com.xxxx.test.client.api.test;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * xxxxx服務
 * 
 * @author ln
 *
 */
@Api(tags = "xxxxx服務")
@RequestMapping(value = "service/test",
    produces = "application/json;charset=utf-8")
public interface TestServiceInterfaceApi {

  /**
   * 查詢
   * 
   * @param id1
   *          id1
   * @param filter
   *          查詢條件
   * @return 查詢結果
   */
  @ApiOperation(value = "查詢")
  @RequestMapping(value = "/query", method = RequestMethod.POST)
  @ResponseBody
  Response<List<TestEntity>> query( //
      @ApiParam(required = true) @PathVariable("id1") String id1,
      @ApiParam(required = true) @RequestBody TestFilter filter);

  /**
   * 批量移除
   * 
   * @param id1
   *          id1
   * @param modifition
   *          處理內容
   * @return 處理結果
   */
  @ApiOperation(value = " 批量移除")
  @RequestMapping(value = "/batchremove", method = RequestMethod.POST)
  @ResponseBody
  Response batchRemove( //
      @ApiParam(required = true) @PathVariable("id1") String id1,
      @ApiParam(required = true) @RequestBody TestBatchRemove batchRemove,
      @ApiParam(required = true) @RequestParam String operator);
}

這時候,在外部系統服務裏 @Autowired 一下 TestServiceInterfaceClient 就能夠調用到咱們的接口了,按道理講這個流程應該順暢無比,畢竟定義 feignClient 才這麼幾行代碼,不可能出錯,but 程序員不多是不寫bug 的~~app

外部服務啓動時,報錯:異步

這個報錯是說咱們中臺服務的某個接口的第2 個參數爲空,可是咱們本地的服務是正常啓用的,內部調用無比順暢,那,問題在哪?ui

通過排查,發現是咱們接口定義用到了 @RequestParam 註解,可是Feign 對 @RequestParam 聲明的參數未識別到,加上參數的名字以後,一切OKspa

/**
   * 批量移除
   * 
   * @param id1
   *          id1
   * @param modifition
   *          處理內容
   * @return 處理結果
   */
  @ApiOperation(value = " 批量移除")
  @RequestMapping(value = "/batchremove", method = RequestMethod.POST)
  @ResponseBody
  Response batchRemove( //
      @ApiParam(required = true) @PathVariable("id1") String id1,
      @ApiParam(required = true) @RequestBody TestBatchRemove batchRemove,
      @ApiParam(required = true) @RequestParam("operator") String operator);
}

後面找了找,發現前面也有不少人遇到了類似的問題,還有網友系統的整理了坑,具體可異步擴展閱讀。

雖然這是一個很小的點,小菜依舊很開心(畢竟不用背鍋啊)。

咱們的中臺功能在不斷地發展全面,so這篇帖子將會不斷更新....

擴展閱讀

相關文章
相關標籤/搜索