swagger2異常:java.lang.NumberFormatException:For input string:""
阿新 • • 發佈:2018-12-13
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 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引數賦值,且值必須為數字型別。
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;
}
大功告成!