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这篇帖子将会不断更新....

扩展阅读

相关文章
相关标签/搜索