需求描述
微服务A有接口,要求:
- 表单包含三个文件字段,两个文本字段。
- 三个文件字段的表单name分别为:swagger、doc、img,
- 两个文本字段的表单name分别为:name、description。
微服务B需要调用微服务A的该接口,需要使用 @FeignClient注解的方式进行调用。要求:
解决手段:
- 配置@RequestMapping 的媒体类型为Multipart表单
- 配置自定义Encoder
实例:
1、接口定义如下:
需要注意的有几点:
- @FeignClient注解中的configuration配置
- 类MultipartConfig,其中注入了默认的消息转换器,配置了自定义的Encoder,配置了日志打印级别。
- @RequestMapping注解中的consumes与produces配置
- 表单参数使用Map<String,Object>,key为表单name,value为表单内容(包括文件和文本)
1 |
|
2、自定义Encoder(FileAndFormDataEncoder类)如下:
需要注意的是:此类和拷贝的SpringFormEncoder的代码,仅仅在encode方法中增加了 if (object instanceof Map) 判断分支,用于处理参数是map的情况。
这里的 if( object instanceof Map) 分支做的事情是先将map中值为null的过滤出去,然后直接传递给了super处理
1 |
|