스터디 & 프로젝트/Init Cloud 팀 프로젝트
[Swagger] NullPointerException 잡기
Floodnut
2023. 2. 23. 00:43
오류 발생
java.lang.NullPointerException: null
at springfox.documentation.builders.ParameterMerger.lambda$mergedParameters$2(ParameterMerger.java:87) ~[springfox-core-3.0.0.jar!/:3.0.0]
at java.base/java.util.stream.ReferencePipeline$2$1.accept(Unknown Source) ~[na:na]
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(Unknown Source) ~[na:na]
스프링 부트 프로젝트를 빌드하고 실행하니 앱 런타임 시점에서 NPE가 발생했다.
발생 위치는 springfox.documentation.builders.ParameterMerger
내부의 87번 라인이다.
원인
class ParameterMerger {
...
private List<springfox.documentation.service.Parameter> mergedParameters(
Set<String> paramsToMerge,
List<springfox.documentation.service.Parameter> existingParameters,
List<springfox.documentation.service.Parameter> newParams) {
List<springfox.documentation.service.Parameter> parameters = new ArrayList<>();
for (springfox.documentation.service.Parameter newParam : newParams) {
Optional<springfox.documentation.service.Parameter> original = existingParameters.stream()
/* 이 라인에서 발생 */ .filter(input -> newParam.getName().equals(input.getName())).findFirst();
if (paramsToMerge.contains(newParam.getName()) && original.isPresent()) {
if (newParam.getOrder() > original.get().getOrder()) {
parameters.add(merged(newParam, original.get()));
} else {
parameters.add(merged(original.get(), newParam));
}
}
}
return parameters;
}
...
}
.filter(input -> newParam.getName().equals(input.getName()))
위 코드에서 보면 filter
메소드 내부의 람다 식에서 NPE가 발생하는 것을 확인할 수 있다.
public class Parameter implements Ordered {
private final String name;
private final String description;
...
}
newParam.getName()
또는 input.getName()
에서 NULL 값을 반환하면서 Optional<>
이 예외처리한 것인데...
해당 객체의 프로퍼티에는 name
이 존재한다.
이 값을 찾지 못해서 NPE가 발생한다고 생각했다.
해결
@ApiImplicitParam(name = "__name__", paramType = "path", value = "__value__", required = true, dataTypeClass = String.class, example = "__example__")
즉, 필수 요소인 name
프로퍼티가 빠진 곳이 있는지를 확인했다.
딱 하나가 name
이 없어져 있더라.