ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swagger] NullPointerException 잡기
    스터디 & 프로젝트/Init Cloud 팀 프로젝트 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이 없어져 있더라.

    댓글

Designed by Tistory.