Feign的默认契约注解详解--呕心沥血之作(3)

文章目录

    • 前置
    • Feign默认契约注解:
      • @RequestLine:
        • value:
        • decodeSlash:
        • collectionFormat:
      • @Param:
        • value:
        • expander:
        • encoded:
      • @Headers:
        • value:
      • @QueryMap:
        • encoded:
      • @HeaderMap:
      • @Body:
    • 注意点


前置

1、这里这是贴出了部分示列代码, 具体代码已经上传到码云: 代码地址
2、本demo采用了feign的继承特性
3、版本: Spring Cloud: Hoxton.SR3、spring-cloud-openfeign: 2.2.2.RELEASE, 服务发现: nacos
4、支持注解:
Feign的默认契约注解详解--呕心沥血之作(3)_第1张图片

Feign默认契约注解:

  • 官方文档: https://github.com/OpenFeign/feign
  • 将契约改为 feign 原生的默认契约, return new feign.Contract.Default(); (FooConfiguration)
  • 通过@FeignClient(configuration="**")指定契约
  • 不指定契约无法使用默认契约注解
  • 示列: 如果一个服务提供者_A, 一个服务消费者_B.
    B基于A创建多个FeignClient_C_D.
    C: 使用RequestMapping, 不使用feign原生的默认契约
    D: 使用RequestLine, 使用feign原生的默认契约
    对应异常:
    1、A bean with that name has already been defined and overriding is disabled.
    2、Method GetFeignClient#getParameters(String,String) not annotated with HTTP method type (ex. GET, POST)
    解决方案:
    第一种异常可使用: spring.main.allow-bean-definition-overriding=true解决, 但是不推荐, 在该示列下解决了第一种会在报第二种异常
    第二种 推荐: 通过配置@FeignClient(contextId="**"), 以避免配置Bean名称相同发生冲突, 但是配置了该值, 要注意细粒度配置
    原因个人看法:
    1、第一种异常bean名称相同发生的, 这个就不多说了
    2、第二种异常, 也是基于bean名称相同发生的, 其中一个bean指定了原生契约, 那么该bean下就只能使用原生契约对应的注解,
    而@RequestMapping并不属于原生契约, 也就是Bean名称相同而产生的冲突引发的问题

@RequestLine:

  • 在方法上使用
  • 一般用法: @RequestLine(“GET /testHeard/getHeard”)
  • @RequestLine(value = “GET /testHeard/getHeard”, decodeSlash = true, collectionFormat = CollectionFormat.EXPLODED)

value:

  • 请求的地址, 请求的方式
  • 格式: 请求方式+空格+路由

decodeSlash:

  • 是否编码/符号, 转义, 默认: true会编码
  • 一般不用管它

collectionFormat:

  • URL参数中编码集合的各种方法
  • 一般不用管它
  • 支持的方法: io-github.openfeign:feign-core.CollectionFormat

@Param:

  • 在参数前面使用
  • 定义一个模板变量, 该变量的值将用于解析相应的模板表达式, 支持: @Headers/@RequestLine/@Body
  • 列: @Headers({“Content-Type: application/json”, “Authorization: {authorization}”})
    CommonResult postHeard(@RequestBody TestEntity data, @Param(“authorization”) String authorization);
    authorization值会被解析到{authorization}
  • @Param(value = “authorization”, encoded = true, expander = Param.ToStringExpander.class) String authorization

value:

  • 匹配模板变量, 必填

expander:

  • 已字符串方式填入模板
  • 默认ToStringExpander.class, 也就这一个选择
  • 一般不用管它

encoded:

  • 是否编码
  • 已经弃用了, 只是为了向后兼容而维护
  • 一般不用管它

@Headers:

  • 在方法上使用(只应用于方法)
  • 在类上使用(应用于所有方法)(目前我个人没有使用过这种方法, 下面示列基于方法使用)
  • 通过使用@Param注解值来解析相应的表达式, 如果需要通过传递头部信息的话
  • 列: @Headers({“Content-Type: application/json”, “Authorization: {authorization}”})
    CommonResult postHeard(@RequestBody TestEntity data, @Param(“authorization”) String authorization);
  • @Headers(value = {“Content-Type: application/json”, “Authorization: {authorization}”})

value:

  • String字符串, key:value格式
  • 就是我们平时指定的头部参数

@QueryMap:

  • 在参数前面使用
  • 只能用于Map | POJO面前, 会将参数拼接至URL后面
  • 列: @RequestLine(“GET /get/getParameters3”)
    CommonResult getParameters3(@QueryMap TestEntity testEntity);
  • @QueryMap(encoded = false)

encoded:

  • 指定参数名和值是否已经编码
  • 默认false
  • 一般不用管它

@HeaderMap:

  • 在参数前面使用
  • 定义名称-值对的映射, 用在Map前面
  • 列: @RequestLine(“GET /testHeard/getHeard”)
    CommonResult getHeard(@SpringQueryMap TestEntity data, @HeaderMap Map headerMap);
  • 和@Headers的用途一样

@Body:

  • 在方法上使用
  • 定义一个模板, 类似于UriTemplate和HeaderTemplate, 它使用@Param注解值来解析相应的表达式
  • 用法可以配合@Param、@Headers进行使用
  • 列: @RequestLine(“POST /testBody/postJSONBody”)
    @Headers(“Content-Type: application/json”)
    @Body("{testJSONString}")
    CommonResult postJSONStringBody(@Param(“testJSONString”) String testJSONString);
    -------
    @Body("%7B"id": “{id}”, “name”: “{name}”%7D")
    CommonResult postJSONBody(@Param(“id”) String id, @Param(“name”) String name);
    -------
    @RequestLine(“POST /testBody/jsonRestfulBody/{count}”)
    @Headers(“Content-Type: application/json”)
    @Body("{testJSONString}")
    CommonResult jsonRestfulBody(@Param(“testJSONString”) String testJSONString, @Param(value = “count”) String count);
    -------
    @RequestLine(“POST /testBody/postKeyValueParametersBody”)
    @Headers(“Content-Type: application/json”)
    @Body("{testJSONString}")
    CommonResult postKeyValueParametersBody(@Param(“testJSONString”) String testJSONString, @QueryMap TestEntity testEntity);
  • 可自行组装, 这里只是大概的罗列

注意点

1、以上都是我基于该版本对应的官网案例, 以及源码的说明, 进行的总结, 个人看法居多, 仅供大家参考

2、大家在使用的时候一定要注意自己的版本, 以及版本对应的官方文档, 这个很重要, 很重要,很重要

3、openfeign对应的其余文章:

代码地址以及对应的postman文件
Feign的使用示列–呕心沥血之作(1)
Feign的@FeignClient详解–呕心沥血之作(2)
Feign的默认契约注解详解–呕心沥血之作(3)
Feign异常–Request method ‘POST‘ not supported
Feign异常–A bean with that name | HTTP method type (ex. GET, POST)

你可能感兴趣的:(Spring,Cloud,+,Nacos,java,spring,feign,openfeign,spring,cloud)