天天看点

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

本文目录

一、背景描述

二、问题原因

2.1 为什么会报错?

2.2 问题排查

2.3 哪种情况会报这样的错?

2.4 为什么上述情况会报错?

三、解决方案

3.1 第一种解决方案

3.2 第二种解决方案

一、背景描述

最近新创建了一个Spring boot项目,接口写完之后,通过Swagger-ui访问调试接口,在浏览器中输入http://localhost:8006/swagger-ui.html 可以正常访问

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

如上图所示,页面显示正常,但是在Idea控制台却报错,如下图:

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

二、问题原因

2.1 为什么会报错?

java.lang.NumberFormatException: For input string: "",根据报错内容显示,是因为输入了 空字符串"",而空字符串无法转为 Number 类型。

2.2 问题排查

由于这是在通过浏览器访问Swagger时控制台报的错,那么我们就从控制台中的swagger报错信息开始查找,如下图红框内显示,AbstractSerializableParameter.java这个类的getExample方法。

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

按住键盘的Ctrl 键,点击AbstractSerializableParameter类,进入swagger的源码查看(在抛出异常的位置打上断点,并以Debug模式启动:)

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

浏览器中刷新swagger文档(重新进入swagger文档),程序停在断点处:

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

通过断点,我们找到了问题,那么我们就可以做对应的修改了,也就是为对应的属性上加上

example

属性就好了,如下:

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

2.3 哪种情况会报这样的错?

目前,只发现了把实体属性用作参数,并且参数类型不是

application/json

时,就会出现这个错。如下图所示:

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案
【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

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中一样。

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

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发现问题得到解决。

【异常处理】关于访问swagger-ui报错java.lang.NumberFormatException: For input string: ““的解决方案总结一、背景描述二、问题原因三、解决方案

完结!