1. 程式人生 > >swagger2異常:java.lang.NumberFormatException:For input string:""

swagger2異常:java.lang.NumberFormatException:For input string:""

1. 異常描述

在訪問swagger首頁時 報錯:

2018-10-05 14:45:13.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]

實體類是這麼寫的:

package cn.lilyssh.order.api.model.request;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.properties.BaseIntegerProperty;
import lombok.Data;
import java.io.Serializable;

@Data
@ApiModel(description = "訂單查詢請求資料")
public class OrderQueryReq implements Serializable {
    @ApiModelProperty(value = "訂單ID")
    private Integer id;
}

2. 異常分析

Illegal DefaultValue null for parameter type integerNumberFormatException: 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引數賦值,且值必須為數字型別。

package cn.lilyssh.order.api.model.request;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.properties.BaseIntegerProperty;
import lombok.Data;
import java.io.Serializable;

@Data
@ApiModel(description = "訂單查詢請求資料")
public class OrderQueryReq implements Serializable {
    @ApiModelProperty(value = "訂單ID",example = "123")
    private Integer id;
}

大功告成!