1. 程式人生 > >Swagger異常:AbstractSerializableParameter : Illegal DefaultValue null for parameter type integer解決方案

Swagger異常:AbstractSerializableParameter : Illegal DefaultValue null for parameter type integer解決方案

文章目錄

出現問題

專案中使用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/
然後將兩個檔案複製進去覆蓋原檔案。

https://github.com/ly641921791/knowledge/raw/master/swagger/fix-jar/swagger-models-1.5.20.jar
https://github.com/ly641921791/knowledge/raw/master/swagger/fix-jar/swagger-models-1.5.20-sources.jar