一、背景描述
最近新创建了一个Spring boot项目,接口写完之后,通过Swagger-ui访问调试接口,在浏览器中输入http://localhost:8006/swagger-ui.html 可以正常访问
如上图所示,页面显示正常,但是在Idea控制台却报错,如下图:
二、问题原因
2.1 为什么会报错?
java.lang.NumberFormatException: For input string: "",根据报错内容显示,是因为输入了 空字符串"",而空字符串无法转为 Number 类型。
2.2 问题排查
由于这是在通过浏览器访问Swagger时控制台报的错,那么我们就从控制台中的swagger报错信息开始查找,如下图红框内显示,AbstractSerializableParameter.java这个类的getExample方法。
按住键盘的Ctrl 键,点击AbstractSerializableParameter类,进入swagger的源码查看(在抛出异常的位置打上断点,并以Debug模式启动:)
浏览器中刷新swagger文档(重新进入swagger文档),程序停在断点处:
通过断点,我们找到了问题,那么我们就可以做对应的修改了,也就是为对应的属性上加上 example
属性就好了,如下:
2.3 哪种情况会报这样的错?
目前,只发现了把实体属性用作参数,并且参数类型不是application/json
时,就会出现这个错。如下图所示:
2.4 为什么上述情况会报错?
上述情况也就是把实体属性用作参数,并且参数类型不是application/json
时,io.swagger.models.parameters.AbstractSerializableParameter 会实例化参数,也就是通过example的值为属性赋值,如果example没有显示赋值,就是空串"",但是如果实体类用作 application/json 那么就不会走这个方法去实例化参数。
三、解决方案
3.1 第一种解决方案
把项目里面的使用这种属性的情况,也就是在@ApiModelProperty注解里面写上 example = “1”,其实就是给出一个示例,具体写1还是2或3都无所谓,但要注意一点是 example 对应的值必须是Integer类型的。如2.2中一样。
3.2 第二种解决方案
既然存在这种问题,开发者不会没有发现吧,然后就去看了看swagger-models的其他版本,发现在swagger-models:1.5.20版本是springfox-swagger2:2.9.2里面依赖的版本,既然是依赖,那就自己引用了一个swagger-models:1.5.21的版本,然后看看源码,发现 在新的版本中进行了改正。于是我把swagger-models:1.5.20版本排除了,然后单独引入了swagger-models:1.5.21版本。
再次通过浏览器访问swagger-ui发现问题得到解决。
完结!