스터디 & 프로젝트/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이 없어져 있더라.