Swagger를 사용하다 보면 가끔 전혀 생각지 못했던 곳에서 오류가 나오곤 한다. 오늘은 이런 오류에 대해서 살펴보자.
[06-27 16:27:39] [ WARN] [i.s.m.p.AbstractSerializableParameter.getExample-421] Illegal DefaultValue null for parameter type integer
java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
at java.base/java.lang.Long.parseLong(Long.java:721)
at java.base/java.lang.Long.valueOf(Long.java:1163)
at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412)
. . .
위 오류(정확히는 warn)가 발생하더라도 프로그램은 잘 동작하니까 그다지 심각한 내용은 아니지만 상당히 긴 trace 내용이 신경이 거슬르게 한다.
문제의 출발점은 io.swagger.models.parameters.AbstractSerializableParameter.getExample에서 발생했는데 당연히 내 코드에서는 해당 메서드를 "직접" 사용한 적은 없었다.
어디서 간접적으로 사용된 곳이 있을텐데..
문제를 일으킨 코드
문제는 아래의 코드에서 발생했다.
@ApiModelProperty(value = "페이지 번호(0..N)")
private Integer page;
ApiModelProperty
example이라는 것은 swagger api가 작성될 때 사용하는 속성의 기본 값이다. 만약 속성의 타입이 Integer이고 example에 별도의 할당이 없는 경우 ""을 Integer로 변경할 수 없어서 발생하는 오류이다.
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiModelProperty {
/**
* A sample value for the property.
*/
String example() default "";
}
ApiModelProperty 뿐 아니라 @ApiParam 등에서도 동일한 문제가 발생할 수 있으므로 오류 상황을 기억했다가 써먹어볼 수 있겠다.
코드 수정
이제 문제의 코드에 example 값을 숫자형으로 넘겨주면 해결이다.
@ApiModelProperty(value = "페이지 번호(0..N)", example = "0")
private Integer page;