질문
처리하기 위해 봄 부팅에서 컨트롤러를 만들 때 모든 사용자 정의 방식의 오류 / 예외 정의 예외를 포함하여 선호해야한다 기법을?
컨트롤러는 봄 부팅의 구현 하는가
ErrorController
?컨트롤러는 Spring의 확장 하는가
ResponseEntityExceptionHandler
?모두 : 단일 컨트롤러 구현 및 그들의 기능을 모두 포함하여 모두 클래스를 확장?
둘 : 두 개의 컨트롤러, 하나의 구현
ErrorController
, 다른 하나는 확장ResponseEntityExceptionHandler
?
목표
이 게시물에 대한 이유는 봄 부팅에서 예외 처리하는 방법 찾을 수 있습니다 모든 다음과 같은 속성을 :
- 모든
Throwable
요청을 처리하는 동안 컨트롤러 / 필터 / 인터셉터에서 발생들 잡힐한다. - 잡기의 경우
Throwable
, 우리는 하지 않는 클라이언트에 스택 추적 또는 기타 구현 세부 사항 중 하나를 노출 할 적 (명시 적으로 그런 식으로 코딩 제외). - 발생한 모든 처리 할 수 있어야
Throwable
자신의 클래스에 의해 별도들. 다른 비 지정된 유형의 경우, 기본 응답을 지정할 수 있습니다. (나는이 것을 확실히 알고 있다 가능@ExceptionHandler
. 그러나ErrorController
?) - 코드는 다음과 목표를 달성하기 위해 어떤 추악한 일 - 어라운드 또는 UB와 함께 가능한 한 깨끗하고 명시해야한다.
자세한 내용은
I는 모두 제어기 (위 1 및 2 참조) 복귀 방법을 포함 할 수 있음을 발견 ResponseEntity
객체를 따라서 예외 처리를 발생하여 클라이언트에 응답을 반환. 그들은 이론적으로 동일한 결과를 생성 할 수 있도록?
이 기술 1과 2의 사용에 거기 몇 가지 자습서는하지만 그들을 비교하거나 몇 가지 추가 질문을 제기하는 이들을 함께 사용하여, 두 가지 옵션을 고려하고 어떤 기사를 발견했습니다 :
그들은 심지어 함께 고려되어야 하는가?
이 두 가지 제안 된 기술의 주요 차이점은 무엇입니까? 유사점은 무엇인가?
하나는 다른보다 강력한 버전인가? 뭔가 하나는 다른 수없는 그 반대는 성립 할 수 있는가?
그들은 함께 사용할 수 있습니까? 이 상황이 필요한 것입니까?
그들이 함께 사용되는 경우, 어떻게 예외가 처리 할 것인가? 이 핸들러 또는 한 모두 통과합니까? 후자의 경우, 어느 쪽?
그들이 함께 사용되며, 예외가 throw되면 내부 컨트롤러 (하나 또는 다른) 예외 처리하는 동안 , 어떻게 예외가 처리 할 것인가? 그것은 다른 컨트롤러로 전송되어 있습니까? 예외는 이론적으로 컨트롤러 사이의 수신 거부를 시작하거나 루프를 비 회복의 다른 종류를 만들 수 있을까?
봄 부팅이 봄의 사용 방법에 대한 신뢰 / 공식 문서 거기에
ResponseEntityExceptionHandler
내부가 아니면이 봄 부팅 응용 프로그램에서 사용할 수를 기대하는 방법?경우
ResponseEntityExceptionHandler
혼자가 이미 충분하다, 왜 않는ErrorController
존재를?
봄의 볼 때 ResponseEntityExceptionHandler
과 함께 @ExceptionHandler
주석, 별도로 예외의 다른 유형을 처리하고 청소기 코드를 사용하여 더 강력한 것 같다. 봄 부팅이 봄의 상단에 내장되어 있기 때문에 그러나,이 평균을 수행합니다
- 봄 부팅을 사용하는 경우, 우리는 구현해야합니다
ErrorController
확장 대신ResponseEntityExceptionHandler
? - 수
ErrorController
모든 것을 할ResponseEntityExceptionHandler
별도의 예외 다른 종류의 처리를 포함하여 깡통을,?
편집 : 관련 : 봄 @ControllerAdvice ErrorController 대
봄 부팅 응용 프로그램 오류 처리에 대한 기본 구성이 - 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의 우선 순위를 설정 .
편집하다:
그것을 간단하게 유지하려면 :
- 예외 핸들러 먼저 스프링 검색 @ControllerAdvice 클래스 내 (@ExceptionHandler 주석 방법). 참조 ExceptionHandlerExceptionResolver을 .
- 던져진 예외 ResponseStatusException로부터 도출 @ResponseStatus 또는 주석이면 그것을 체크한다. 참조 ResponseStatusExceptionResolver을 .
- 그 다음은 스프링 MVC 예외 '기본 핸들러를 통해 간다. 참조 DefaultHandlerExceptionResolver을 .
- 아무것도 찾을 수없는 경우, 그리고 마지막에, 컨트롤이 뒤에 전역 오류 핸들러 오류 페이지보기로 전달됩니다. 예외가 오류 처리기 자체에서 오는 경우이 단계는 실행되지 않습니다.
- 오류 뷰가 발견되지 않는 경우 (예를 들어 글로벌 에러 처리기를 사용할 수 없음) 또는 4 단계는 예외가 컨테이너에 의해 처리된다 스킵된다.