swagger报错如下:
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_171]
at java.lang.Long.parseLong(Long.java:601) ~[na:1.8.0_171]
at java.lang.Long.valueOf(Long.java:803) ~[na:1.8.0_171]
at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412) ~[swagger-models-1.5.20.jar:1.5.20]
at sun.reflect.GeneratedMethodAccessor137.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:664) [jackson-databind-2.8.11.2.jar:2.8.11.2]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689) [jackson-databind-2.8.11.2.jar:2.8.11.2]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155) [jackson-databind-2.8.11.2.jar:2.8.11.2]
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) [jackson-databind-2.8.11.2.jar:2.8.11.2]
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) [jackson-databind-2.8.11.2.jar:2.8.11.2]
方案一:
1》原本的model类
@ApiModel(description = "订单查询请求数据")
public class Order implements Serializable {
@ApiModelProperty(value = "订单ID")
private Integer id;
}
2》异常分析
Illegal DefaultValue null for parameter type integer`和`NumberFormatException: For input string: ""
翻译:有个默认值是空字符串的变量转换成Integer
类型时异常。
at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412) ~[swagger-models-1.5.20.jar:1.5.20]
点进去AbstractSerializableParameter.java:412
可以看到
if (BaseIntegerProperty.TYPE.equals(type)) {
return Long.valueOf(example);
}
就是说如果实体属性类型是Integer
,就把example
转为Long
类型,而example
默认为"",导致转换错误。
3》解决:
实体类中,Integer
类型的属性加@ApiModelProperty
时,必须要给example
参数赋值,且值必须为数字类型。(比较麻烦)
@ApiModel(description = "订单查询请求数据")
public class Order implements Serializable {
@ApiModelProperty(value = "订单ID",example = "123")
private Integer id;
}
方案二:
由方案一查看源码 报错位置:
if (BaseIntegerProperty.TYPE.equals(type)) {
return Long.valueOf(example);
}
若将源码中的if (BaseIntegerProperty.TYPE.equals(type))改为if (BaseIntegerProperty.TYPE.equals(type) && (example == null || example.isEmpty()))就可以解决问题。我下载并修改了源码,将其打包后覆盖了maven仓库的jar包,这样项目代码不需要任何修改就可以解决问题。
同时,我又查看了v1.5.21的代码 ,源码的修改是一样的。其实也可以排除1.5.20版本的swagger-models.jar,引入1.5.21版本的swagger-models.jar。但是考虑到可能由于代码改动较大引发其他问题,因此个人感觉还是在1.5.20版本代码微调最好。
最后把修复过的jar包下载链接放在这里,下载后替换本地仓库对应的文件,然后项目重新导入jar包即可。
然后将两个文件复制进去覆盖原文件。
jar包下载地址:https://pan.baidu.com/s/1UhOAD2IgkORZ3OBGwmu70Q 提取码:8hdw