programing

Spring Boot의 Error Controller 및 Spring의 ResponseEntity 사용Exception Handler가 올바르게 실행됨

abcjava 2023. 3. 17. 19:30
반응형

Spring Boot의 Error Controller 및 Spring의 ResponseEntity 사용Exception Handler가 올바르게 실행됨

질문

커스텀 예외를 포함한 모든 오류/예외를 커스텀 방식으로 처리하기 위해 Spring Boot에서 컨트롤러를 작성하는 경우 어떤 기술을 사용하는 것이 좋습니까?

  1. 의 「스프링 부트」를 필요가 ?ErrorController

  2. 는 스프링의 '을 ?ResponseEntityExceptionHandler

  3. 둘 다: 단일 컨트롤러가 두 가지 기능을 모두 포함하여 두 가지 클래스를 모두 구현하고 확장합니까?

  4. 다:의 개별 의 컨트롤러가 실장되어 있다: 2개의 컨트롤러, 1개의 컨트롤러ErrorController의 확장자ResponseEntityExceptionHandler

목표

이 투고를 하는 이유는 다음 속성을 모두 가진 Spring Boot에서 예외 처리 방법을 찾기 위해서입니다.

  • ★★★★★Throwable요청 처리 중 컨트롤러/컨트롤러/컨트롤러에서 발생하는 것을 검출해야 합니다.
  • ★★★★★★★★★★★★★★★★★★★★를 잡는 경우Throwable스택 트레이스 또는 기타 구현에 대한 자세한 내용은 클라이언트에 공개하지 않습니다(명시적으로 코드화되어 있지 않은 한).
  • 한 모든 할 수 .Throwable클래스별로 구분됩니다.기타 지정되지 않은 유형의 경우 기본 응답을 지정할 수 있습니다.(확실히, 이것은,@ExceptionHandlerErrorController
  • 코드는 가능한 한 깨끗하고 명시적이어야 합니다.추악한 회피책이나 이 목표를 달성하기 위한 UB는 없습니다.

상세

에 「」( 「1」2」)를 하는 메서드가 포함되어 있는 을 알 수 .ResponseEntityobject를client.에 응답이 됩니다. 따라서 발생한 예외가 처리되고 클라이언트에 응답이 반환됩니다.그럼 이론적으로 같은 결과를 얻을 수 있다는 건가요?

기술 1과 2의 사용에 관한 튜토리얼이 몇 개 있습니다.그러나 두 가지 옵션을 모두 검토하거나 비교하거나 함께 사용하는 기사는 찾을 수 없었습니다. 따라서 다음과 같은 몇 가지 추가 질문이 제기됩니다.

  1. 둘이 함께 고려되긴 해야 하나요?

  2. 이 두 가지 제안된 기술 간의 주요 차이점은 무엇입니까?어떤 점이 유사합니까?

  3. 하나는 다른 것보다 더 강력한 버전인가요?상대방이 할 수 없는 것과 그 반대인 것이 있습니까?

  4. 함께 사용할 수 있나요?이것이 필요한 상황이 있습니까?

  5. 이 두 가지를 함께 사용할 경우 예외는 어떻게 처리됩니까?양쪽 핸들러를 통과합니까, 아니면 한쪽 핸들러를 통과합니까?후자의 경우, 어떤 것입니까?

  6. 이 두 가지를 함께 사용하여 예외 처리 중에 컨트롤러 내부(1개 또는 다른 하나)에 예외가 발생하는 경우 해당 예외는 어떻게 처리됩니까?다른 컨트롤러로 전송됩니까?이론적으로 예외는 컨트롤러 간에 바운싱을 시작하거나 복구되지 않는 다른 루프를 생성할 수 있습니까?

  7. Spring 신뢰할 수 있는 ?ResponseEntityExceptionHandlerSpring Boot spring spring boot boot spring spring spring spring spring spring spring spring spring spring spring spring spring spring spring spring spring?

  8. ifResponseEntityExceptionHandler 왜 '이러다'는 거죠?ErrorController

의 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.ResponseEntityExceptionHandler★★★★★★★★★★★★★★★와 함께@ExceptionHandler주석은 다른 유형의 예외를 개별적으로 처리하고 더 깨끗한 코드를 사용하는 데 더 강력한 것으로 보입니다.스프링 부츠 스프링

  • 을 사용할 때는 Spring Boot를 구현해야 .ErrorController 확장하지 ResponseEntityExceptionHandler
  • 수 있다ErrorController 수단을 다 쓰다ResponseEntityExceptionHandler다른 유형의 예외를 개별적으로 처리하는 것을 포함하여 가능합니까?

편집: 관련: Spring @Controller Advice vs Error Controller

Spring Boot 어플리케이션에는 에러 처리를 위한 기본 설정인 ErrorMvcAutoConfiguration이 있습니다.

추가 설정이 제공되지 않는 경우 기본 기능:

  • 기본 글로벌 오류 컨트롤러가 생성됩니다(Basic Error Controller).
  • 기본 'error' 정적 뷰 'Whitelabel Error Page'를 만듭니다.

BasicErrorController에러'/error'입니다.응용 프로그램에 커스터마이즈된 '에러' 뷰가 없는 경우 컨트롤러에서 예외가 발생한 경우 사용자는 BasicErrorController에 의해 정보가 채워진 /error whitelabel 페이지로 이동합니다.

프로그램에 " " 를 하는 경우ErrorController대신하다 BasicErrorController.

에러 처리 컨트롤러에서 예외가 발생하면 스프링 예외 필터(아래 자세한 내용은 참조)를 통과합니다.마지막으로 아무것도 발견되지 않으면 이 예외는 기본 응용 프로그램컨테이너에 의해 처리됩니다.Tomcat.기본 컨테이너는 예외를 처리하고 구현에 따라 일부 오류 페이지/메시지를 표시합니다.

이 글에 내용이 있어요.BasicErrorController 자바독:

기본 글로벌 오류 컨트롤러, ErrorAttributes 렌더링.보다 구체적인 오류는 Spring MVC 추상화(@ExceptionHandler 등)를 사용하거나 서블릿서버 오류 페이지를 추가하여 처리할 수 있습니다.

BasicErrorController또는ErrorController구현은 글로벌오류 핸들러입니다@ExceptionHandler와 함께 사용할 수 있습니다.

Response Entity를 소개합니다.예외 핸들러

모든 @RequestMapping 메서드에서 @ExceptionHandler 메서드를 통해 일원화된 예외 처리를 제공하는 @ControllerAdvice 클래스의 편리한 기본 클래스입니다.이 기본 클래스는 내부 Spring MVC 예외를 처리하기 위한 @ExceptionHandler 메서드를 제공합니다.

바꿔 말하면, 그건ResponseEntityExceptionHandlerSpring MVC 예외 처리가 이미 포함되어 있는 편의 클래스일 뿐입니다.커스텀 클래스의 베이스 클래스로서 컨트롤러의 예외를 처리할 수 있습니다.커스텀 클래스가 기능하려면 , 다음의 코멘트를 붙여야 합니다.@ControllerAdvice.

「」가 .@ControllerAdvice핸들러와 할 수 (「 」BasicErrorController ★★★★★★★★★★★★★★★★★」ErrorController★★★★★★★★★★★★★★★★★★★★★★★★★★.@ControllerAdvice클래스('/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'/'를 확장할 수 없음)ResponseEntityExceptionHandler는 일부이는 일부 예외를 처리하지 않습니다.예외는 글로벌오류 핸들러로 넘어갑니다.

까지 살펴본 것은 ★★★★★★★★★★★★★ ★ErrorHandler및 anything the asnoted with the anything to asnoted to the 」(컨트롤러 및 ''로 주석@ControllerAdvice하지만 그것은 훨씬 더 복잡하다."여러 @ControllerAdvice @ExceptionHandlers의 우선순위 설정"이라는 질문에서 매우 귀중한 통찰력을 얻었습니다.

편집:

심플하게 하기 위해서:

  1. First Spring은 @ControllerAdvice 클래스 내에서 예외 핸들러(@ExceptionHandler 주석 메서드)를 검색합니다.Exception Handler Exception Resolver 를 참조하십시오.
  2. 그런 다음 느려진 예외가 @ResponseStatus에서 주석을 달았는지 또는 ResponseStatusException에서 파생되었는지 확인합니다.Response Status Exception Resolver를 참조하십시오.
  3. 그런 다음 Spring MVC 예외의 기본 핸들러를 통과합니다.Default Handler Exception Resolver 를 참조하십시오.
  4. 그리고 마지막으로 아무것도 발견되지 않으면 컨트롤은 글로벌 오류 핸들러 뒤에 있는 오류 페이지 뷰로 전송됩니다.예외가 오류 핸들러 자체에서 발생한 경우 이 단계는 실행되지 않습니다.
  5. 오류 보기를 찾을 수 없거나(예: 전역 오류 핸들러가 비활성화됨) 단계 4를 건너뛰면 컨테이너가 예외를 처리합니다.

Spring의 Error Controller에 대해 잘 모르는 것은 인정합니다만, 당신이 지정한 목표를 보면 Spring의 @ControllerAdvice를 사용하면 모두 깨끗하게 달성할 수 있다고 생각합니다.다음은 제 어플리케이션에서 사용하고 있는 예를 나타냅니다.

@ControllerAdvice
public class ExceptionControllerAdvice {

    private static final String INCOMING_REQUEST_FAILED = "Incoming request failed:";
    private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionControllerAdvice.class);
    private final MessageSource source;

    public ExceptionControllerAdvice2(final MessageSource messageSource) {
        source = messageSource;
    }

    @ExceptionHandler(value = {CustomException.class})
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ErrorMessage badRequest(final CustomException ex) {
        LOGGER.error(INCOMING_REQUEST_FAILED, ex);
        final String message = source.getMessage("exception.BAD_REQUEST", null, LocaleContextHolder.getLocale());
        return new ErrorMessage(HttpStatus.BAD_REQUEST.value(), message);
    }

    @ExceptionHandler(Throwable.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ErrorMessage internalServerError(final Exception ex) {
        LOGGER.error(INCOMING_REQUEST_FAILED, ex);
        final String message =
                source.getMessage("exception.INTERNAL_SERVER_ERROR", null, LocaleContextHolder.getLocale());
        return new ErrorMessage(HttpStatus.INTERNAL_SERVER_ERROR.value(), message);
    }
}

언급URL : https://stackoverflow.com/questions/55101797/using-spring-boots-errorcontroller-and-springs-responseentityexceptionhandler

반응형