现象
应用依赖 Springfox 2.9.1 + Swagger 1.5.20,启动后,访问swagger-ui.html,报错如下:
Illegal DefaultValue null for parameter type integer
java.lang.NumberFormatException: For input string: ""
原因
原因是 @ApiModelProperty
注解的 example
属性值默认为 ""
,而 io.swagger.models.parameters.AbstractSerializableParameter#getExample
方法在将其转换为被注解字段对应类型时,1.5.20 版本只判断了 example == null
,而没有判断是否为 example.isEmpty()
,然后就可能尝试调用 Long.valueOf(example)
,导致转换失败。关键源码:
@JsonProperty("x-example")
public Object getExample() {
if (example == null) {
if (example == null || example.isEmpty()) {
return null;
}
try {
if (BaseIntegerProperty.TYPE.equals(type)) {
return Long.valueOf(example);
} else if (DecimalProperty.TYPE.equals(type)) {
return Double.valueOf(example);
} else if (BooleanProperty.TYPE.equals(type)) {
if ("true".equalsIgnoreCase(example) || "false".equalsIgnoreCase(defaultValue)) {
return Boolean.valueOf(example);
}
}
} catch (NumberFormatException e) {
LOGGER.warn(String.format("Illegal DefaultValue %s for parameter type %s", defaultValue, type), e);
}
return example;
}
官方的修正见:https://github.com/swagger-api/swagger-core/pull/2865/files
解决方法
参考 Springfox 项目的一个讨论:@ApiModelProperty throwing NumberFormatException if example value is not set,将 swagger-annotations 和 swagger-models 包版本升级到 1.5.21,即可解决。
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
参考
- Swagger2异常:Illegal DefaultValue null for parameter type integer(2.9.2版本)
- @ApiModelProperty throwing NumberFormatException if example value is not set
文档信息
- 本文作者:Zhuang Ma
- 本文链接:https://mazhuang.org/fragment/swagger-springfox-NumberFormatException/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)