事出有因
所謂約定大于配置豹障,swaggger提供的接口描述注解可以實現接口的任意自定義的描述冯事,但是每個接口都那么寫,看起來就煩血公,按照項目的規(guī)范桅咆,幾乎所有接口約定的格式等都是一致的,只需要使用@ApiParam
描述參數意義即可坞笙。
以上岩饼,發(fā)現有時參數的parmType會被解析為query
荚虚,有時會解析為body
,導致前端文檔顯示錯誤
取經之路
于是乎一個debugger就是跟
發(fā)現swagger使用了一堆plugin來解析參數籍茧,其中有一個叫springfox.documentation.spring.web.readers.parameter.ParameterTypeReader
的插件版述,專門來解析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 |
到這里發(fā)現問題,我的接口參數很多都只有@ApiParam
這一個注解來描述參數意義寞冯,這樣就會都走到最后返回默認的body
渴析,導致接口發(fā)生問題,而正確的類型應該是query
吮龄,由上表看來俭茧,使paramType變?yōu)閝uery的方式有2種
- 不加任何注解、consumes不包含
application/x-www-form-urlencoded
和multipart/form-data
- 使用
@RequestParam
注解漓帚,consumes不包含application/x-www-form-urlencoded
和multipart/form-data
consumes我就沒設置過母债,所以只能使用@RequestParam
注解來使paramType變?yōu)?code>query,但是每個接口都要加,這么大(xiao)的工作量我能妥協嗎? 顯然不能!
正確的解決方案:
于是自定義CustomParameterTypeReader
修改默認的返回值為query
尝抖,然后@Component毡们、@Order
作為bean并將優(yōu)先級調至最低(@Order默認的就是最大值),因為swagger插件的順序是使用AnnotationAwareOrderComparator
來排序的昧辽,這樣衙熔,在原有的ParameterTypeReader配置paramType之后,我們自定義的CustomParameterTypeReader
將覆蓋paramType搅荞,實現最終目的