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