Swagger文档接口参数类型query or body?

2019-10-28  本文已影响0人  若兮相言

事出有因

所谓约定大于配置,swaggger提供的接口描述注解可以实现接口的任意自定义的描述,但是每个接口都那么写,看起来就烦,按照项目的规范,几乎所有接口约定的格式等都是一致的,只需要使用@ApiParam描述参数意义即可。
以上,发现有时参数的parmType会被解析为query,有时会解析为body,导致前端文档显示错误

取经之路

于是乎一个debugger就是跟
发现swagger使用了一堆plugin来解析参数,其中有一个叫springfox.documentation.spring.web.readers.parameter.ParameterTypeReader的插件,专门来解析parmType

解析参数parmType 参数无注解时 解析文件类型

代码的意思我整理了一个表格

条件 对应parmType
@PathVariable注解 path
@RequestBody注解 body
@RequestPart注解 formData
@RequestHeader注解 header
@RequestParam注解 解析方式和无注解时一致
参数类型为MultipartFile或被Collection\Array等包装的MultipartFile form
无任何注解consumes包含application/x-www-form-urlencoded且接口类型为post form
无任何注解consumes包含multipart/form-data且接口类型为post formData
无任何注解且不满足上述2个条件 query
不符合上述任何条件 body

到这里发现问题,我的接口参数很多都只有@ApiParam这一个注解来描述参数意义,这样就会都走到最后返回默认的body,导致接口发生问题,而正确的类型应该是query,由上表看来,使paramType变为query的方式有2种

  1. 不加任何注解、consumes不包含application/x-www-form-urlencodedmultipart/form-data
  2. 使用@RequestParam注解,consumes不包含application/x-www-form-urlencodedmultipart/form-data

consumes我就没设置过,所以只能使用@RequestParam注解来使paramType变为query,但是每个接口都要加,这么大(xiao)的工作量我能妥协吗? 显然不能!

正确的解决方案:

于是自定义CustomParameterTypeReader 修改默认的返回值为query,然后@Component、@Order作为bean并将优先级调至最低(@Order默认的就是最大值),因为swagger插件的顺序是使用AnnotationAwareOrderComparator来排序的,这样,在原有的ParameterTypeReader配置paramType之后,我们自定义的CustomParameterTypeReader将覆盖paramType,实现最终目的

获取到所有插件后使用AnnotationAwareOrderComparator进行排序
上一篇 下一篇

猜你喜欢

热点阅读