文章目录
-
- 前置
- Feign默认契约注解:
-
- @RequestLine:
-
- value:
- decodeSlash:
- collectionFormat:
- @Param:
-
- value:
- expander:
- encoded:
- @Headers:
-
- @QueryMap:
-
- @HeaderMap:
- @Body:
- 注意点
前置
1、这里这是贴出了部分示列代码, 具体代码已经上传到码云: 代码地址
2、本demo采用了feign的继承特性
3、版本: Spring Cloud: Hoxton.SR3、spring-cloud-openfeign: 2.2.2.RELEASE, 服务发现: nacos
4、支持注解:

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)