目前公司用的swagger在线文档,可是昨天我更新代码后,文档就打不开了,访问的时候后台报错,下面上图:
开始也不知道是为什么,以为项目哪个地方有了问题,上厕所的时候,问了一个同事,他那居然可以,由于着急调试接口,就用postman测了一下,今天来上班发现还是不行,然后我就打断点跟了下代码:
这里需要用异常断点调试,不然swagger会拦截项目里写了swagger的注解,如图:
根据description找到对应的位置:
因为在我平时的写法中,没有参数名后面用中括号的,而且这里是Delete请求方式,一般都是放到body里面的,我猜测是写这个接口的人和对应的前端不知道怎么传数组,关于怎么传参下面进行解释,当时我就把注解改成了下面这样:@RequestParam(value = “idList[]”) -->@RequestBody ,代码就不贴了,然后重启项目再试,就可以了。
问题解决了,但是代码不是我写的,我就找到提交代码的人,问他为什么这个地方这样传参,不放到body里面,他给我的解释居然真是不这样传不过去,到这里我就明白了,让他先改成放到body里面,然后我看了下前端代码传参是这样的:
然后我让他改成下面这样:
其实前端传参数的位置就是这个data或者params,params是把参数拼到url上,而data是把参数放到请求体里,但是由于项目里大面积的get请求,而且网上的例子大多也都是params,很多人这个地方就写params,然后会导致数组不能传不到后台,改成这样之后,重新测试了下他这个接口也成功了,java中SpringMVC那个RequestParam注解也一样是接收url中的参数。
还有一个问题就是为什么之前我那个同事可以访问文档,我却不可以,他说他代码都提交了,我就仔细看了下他本地的代码和我那里的,发现两个注解的属性值不同:
我就尝试把这俩属性值改成一样,然后照样可以访问,具体源码怎么处理的我就不去深究了。
另外swagger文档还有三个问题:
- swagger默认参数是非必传,mvc 的 RequestParam 注解默认是必传,这样会导致在线文档和实际的不一致
- 如果controller方法接收的是一个对象,那么这个对面的属性在文档中就默认全是非必传,如果对象属性很多,处理是很不方便的
- swagger在线文档测试不能传附件,有附件的接口还是需要用postman去测