void org.springframework.web.method.ControllerAdviceBean.<init>(java.lang.Object)

728x90

 

GlobalExceptionHandler extends ResponseEntityExceptionHandler 과 Swagger 충돌 해결하기

 

1. Swagger 버전 확인하기

 

Swagger에서 ResponseEntityExceptionHandler 를 정의해서 사용하는 방법이 있는데 특정버전

2점대 Spring 과 3점대 Spring이 다릅니다.

 

먼저 확인해서 버전을 맞춰봅니다.

 

근데 보통은 맞습니다.

 

2. 다른 사람들은 직접 정의해서?

 

@Slf4j
@RestControllerAdvice(annotations = {RestController.class}, basePackages = {"com.example.HyThon.web.controller"})
public class ExceptionAdvice extends ResponseEntityExceptionHandler {
    
    ...
}

출처: https://dev-meung.tistory.com/entry/해커톤-HY-THON-트러블슈팅-Swagger-500-에러-Failed-to-load-API-definition [IT::Coding:티스토리]

 

이렇게해서 직접 정의해서 해결했다고 했는데 안에 정보가 안보이니 정확히 어떻게된건지는 잘모르겠습니다. 

 

 

3. Swagger 어노테이션 Hidden옵션 사용하기 

 

package io.swagger.v3.oas.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Hidden {
}

 

스웨거 자체에서 해당 런타임이 되었을때 특정 class를 안타고 사용할 수 있는 방법입니다.

 

원래는 

 

  • @Hidden 애너테이션은 Swagger (OpenAPI 3) 문서에서 특정 엔티티, 필드, 메서드 등을 숨기고 싶을 때 사용됩니다.
  • 즉, API 문서(Swagger UI)에서 특정 요소를 노출하지 않도록 설정할 수 있습니다.

이런목적으로 사용하는 건데요. 이거를 활용해서 글로벌 익셉션은 어차피 스웨거 이후 타지게 되는 것을 의도하였으니

히든 처리로 해볼 수 있습니다.

 

물론 임시방편인 것 같아 방안을 찾아보고 있는데요.

일반적으로 개발환경에서만 Swagger를 붙이니 크게 문제는 없어 보이지만 , 근본적인 해결법을 찾게되면 추가해서 알려드리겠습니다.

 

728x90