제대로 봄 부팅의 ErrorController과 봄의 ResponseEntityExceptionHandler 사용

anddero :

질문

처리하기 위해 봄 부팅에서 컨트롤러를 만들 때 모든 사용자 정의 방식의 오류 / 예외 정의 예외를 포함하여 선호해야한다 기법을?

  1. 컨트롤러는 봄 부팅의 구현 하는가 ErrorController?

  2. 컨트롤러는 Spring의 확장 하는가 ResponseEntityExceptionHandler?

  3. 모두 : 단일 컨트롤러 구현 및 그들의 기능을 모두 포함하여 모두 클래스를 확장?

  4. 둘 : 두 개의 컨트롤러, 하나의 구현 ErrorController, 다른 하나는 확장 ResponseEntityExceptionHandler?

목표

이 게시물에 대한 이유는 봄 부팅에서 예외 처리하는 방법 찾을 수 있습니다 모든 다음과 같은 속성을 :

  • 모든 Throwable요청을 처리하는 동안 컨트롤러 / 필터 / 인터셉터에서 발생들 잡힐한다.
  • 잡기의 경우 Throwable, 우리는 하지 않는 클라이언트에 스택 추적 또는 기타 구현 세부 사항 중 하나를 노출 할 (명시 적으로 그런 식으로 코딩 제외).
  • 발생한 모든 처리 할 수 있어야 Throwable자신의 클래스에 의해 별도들. 다른 비 지정된 유형의 경우, 기본 응답을 지정할 수 있습니다. (나는이 것을 확실히 알고 있다 가능 @ExceptionHandler. 그러나 ErrorController?)
  • 코드는 다음과 목표를 달성하기 위해 어떤 추악한 일 - 어라운드 또는 UB와 함께 가능한 한 깨끗하고 명시해야한다.

자세한 내용은

I는 모두 제어기 (위 1 및 2 참조) 복귀 방법을 포함 할 수 있음을 발견 ResponseEntity객체를 따라서 예외 처리를 발생하여 클라이언트에 응답을 반환. 그들은 이론적으로 동일한 결과를 생성 할 수 있도록?

이 기술 1과 2의 사용에 거기 몇 가지 자습서는하지만 그들을 비교하거나 몇 가지 추가 질문을 제기하는 이들을 함께 사용하여, 두 가지 옵션을 고려하고 어떤 기사를 발견했습니다 :

  1. 그들은 심지어 함께 고려되어야 하는가?

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

  3. 하나는 다른보다 강력한 버전인가? 뭔가 하나는 다른 수없는 그 반대는 성립 할 수 있는가?

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

  5. 그들이 함께 사용되는 경우, 어떻게 예외가 처리 할 것인가? 이 핸들러 또는 한 모두 통과합니까? 후자의 경우, 어느 쪽?

  6. 그들이 함께 사용되며, 예외가 throw되면 내부 컨트롤러 (하나 또는 다른) 예외 처리하는 동안 , 어떻게 예외가 처리 할 것인가? 그것은 다른 컨트롤러로 전송되어 있습니까? 예외는 이론적으로 컨트롤러 사이의 수신 거부를 시작하거나 루프를 비 회복의 다른 종류를 만들 수 있을까?

  7. 봄 부팅이 봄의 사용 방법에 대한 신뢰 / 공식 문서 거기에 ResponseEntityExceptionHandler내부가 아니면이 봄 부팅 응용 프로그램에서 사용할 수를 기대하는 방법?

  8. 경우 ResponseEntityExceptionHandler혼자가 이미 충분하다, 왜 않는 ErrorController존재를?

봄의 볼 때 ResponseEntityExceptionHandler과 함께 @ExceptionHandler주석, 별도로 예외의 다른 유형을 처리하고 청소기 코드를 사용하여 더 강력한 것 같다. 봄 부팅이 봄의 상단에 내장되어 있기 때문에 그러나,이 평균을 수행합니다

  • 봄 부팅을 사용하는 경우, 우리는 구현해야합니다 ErrorController확장 대신 ResponseEntityExceptionHandler?
  • ErrorController모든 것을 할 ResponseEntityExceptionHandler별도의 예외 다른 종류의 처리를 포함하여 깡통을,?

편집 : 관련 : 봄 @ControllerAdvice ErrorController 대

DA-SHA1 :

봄 부팅 응용 프로그램 오류 처리에 대한 기본 구성이 - ErrorMvcAutoConfiguration .

그것은 기본적으로 무엇을, 추가 구성이 제공하지 않는 경우 :

  • 그것은 기본 전역 오류 컨트롤러를 생성 - BasicErrorController을
  • 그것은 기본 '오류'정적보기 '허용 목록 라벨 오류 페이지'를 만듭니다.

BasicErrorController기본적으로 '/ 오류'로 연결되어 있습니다. 더 BasicErrorController 의해 정보가 들어가있는 컨트롤러로 / 오류 허용 목록 라벨 페이지 사용자 랜드에서 예외 발생의 경우에는 프로그램의 '에러'뷰를 정의가되어 있지 않은 경우.

응용 프로그램을 구현하는 컨트롤러가있는 경우 ErrorController그것을 대체합니다 BasicErrorController .

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

정보의 흥미로운 부분이있다 BasicErrorController javadoc에서는 :

기본 전역 오류 컨트롤러, ErrorAttributes 렌더링. 보다 구체적인 오류는 스프링 MVC 추상화를 사용하여 (예를 들어, 하나 처리 할 수 있습니다 @ExceptionHandler ) 또는 서블릿 서버 오류 페이지를 추가하여.

BasicErrorController또는 ErrorController구현은입니다 전역 오류 핸들러 . 그것은 @ExceptionHandler와 함께 사용될 수있다.

여기에서 우리는 올 ResponseEntityExceptionHandler

원하는 @ControllerAdvice 클래스의 편리한 기본 클래스는 @ExceptionHandler 방법을 통해 모든 @RequestMapping 방법을 통해 예외 처리를 집중 제공합니다. 이 기본 클래스는 내부 스프링 MVC의 예외를 처리하기위한 @ExceptionHandler 방법을 제공한다.

즉, 그 수단 ResponseEntityExceptionHandler이미 스프링 MVC 예외 처리를 포함 단지 편리한 클래스이다. 그리고 우리는 핸들 컨트롤러의 예외에 대한 우리의 사용자 정의 클래스에 대한 기본 클래스로 사용할 수 있습니다. 일에 우리의 사용자 정의 클래스를 들어, 주석해야합니다 @ControllerAdvice.

주석 클래스 @ControllerAdvice글로벌 에러 처리기 (동시에 사용할 수 BasicErrorController또는 ErrorController이행). 우리의 경우 @ControllerAdvice주석 클래스가 (이 수 / 또는 확장하지 ResponseEntityExceptionHandler) 몇 가지 예외를 처리하지 않는 예외는 전역 오류 처리기로 이동합니다.

지금까지 우리는 보았다 ErrorHandler컨트롤러와 아무것도 주석 @ControllerAdvice. 그러나 그것은 훨씬 더 복잡하다. - 나는 문제가 정말 가치있는 통찰력을 발견 여러 @ControllerAdvice의 @ExceptionHandlers의 우선 순위를 설정 .

편집하다:

그것을 간단하게 유지하려면 :

  1. 예외 핸들러 먼저 스프링 검색 @ControllerAdvice 클래스 내 (@ExceptionHandler 주석 방법). 참조 ExceptionHandlerExceptionResolver을 .
  2. 던져진 예외 ResponseStatusException로부터 도출 @ResponseStatus 또는 주석이면 그것을 체크한다. 참조 ResponseStatusExceptionResolver을 .
  3. 그 다음은 스프링 MVC 예외 '기본 핸들러를 통해 간다. 참조 DefaultHandlerExceptionResolver을 .
  4. 아무것도 찾을 수없는 경우, 그리고 마지막에, 컨트롤이 뒤에 전역 오류 핸들러 오류 페이지보기로 전달됩니다. 예외가 오류 처리기 자체에서 오는 경우이 단계는 실행되지 않습니다.
  5. 오류 뷰가 발견되지 않는 경우 (예를 들어 글로벌 에러 처리기를 사용할 수 없음) 또는 4 단계는 예외가 컨테이너에 의해 처리된다 스킵된다.

추천

출처http://43.154.161.224:23101/article/api/json?id=183738&siteId=1