Swagger異常:AbstractSerializableParameter : Illegal DefaultValue null for parameter type integer解決方案
阿新 • • 發佈:2019-01-27
文章目錄
出現問題
專案中使用Swagger作為文件工具,每次開啟文件時,控制檯都會打印出如下異常。
2018-10-24 23:03:36.537 WARN 19699 --- [nio-1111-exec-4] i.s.m.p.AbstractSerializableParameter : Illegal DefaultValue null for parameter type integer 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.GeneratedMethodAccessor109.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:687) [jackson-databind-2.9.6.jar:2.9.6]
問題原因
這是由於實體類使用@ApiModelProperty
時,example
屬性沒有賦值導致的,在AbstractSerializableParameter
的getExample方法中會將數值屬性的example的轉換數值類返回,example的預設值是"",因此當example沒有賦值時,會出現上面的異常。getExample方法如下
@JsonProperty("x-example")
public Object getExample() {
if (example == null) {
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;
}
解決方案
只要將每一個數值型別上@ApiModelProperty
的example都賦值數字字串即可。
但是這個解決方法比較麻煩,若將原始碼中的if (example == null)
改為if (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包即可。
例如,我的電腦,通過命令列進入如下目錄
cd /Users/ly/.m2/repository/io/swagger/swagger-models/1.5.20/
然後將兩個檔案複製進去覆蓋原檔案。