@ -70,7 +70,7 @@ import org.springframework.web.util.WebUtils;
@@ -70,7 +70,7 @@ import org.springframework.web.util.WebUtils;
* using view resolution ( e . g . , via { @code ContentNegotiatingViewResolver } ) ,
* then { @code DefaultHandlerExceptionResolver } is good enough .
*
* < p > Note that in order for an { @code @ControllerAdvice } sub - class to be
* < p > Note that in order for an { @code @ControllerAdvice } subclass to be
* detected , { @link ExceptionHandlerExceptionResolver } must be configured .
*
* @author Rossen Stoyanchev
@ -121,8 +121,9 @@ public abstract class ResponseEntityExceptionHandler {
@@ -121,8 +121,9 @@ public abstract class ResponseEntityExceptionHandler {
AsyncRequestTimeoutException . class
} )
@Nullable
public final ResponseEntity < Object > handleException ( Exception ex , WebRequest request ) {
public final ResponseEntity < Object > handleException ( Exception ex , WebRequest request ) throws Exception {
HttpHeaders headers = new HttpHeaders ( ) ;
if ( ex instanceof HttpRequestMethodNotSupportedException ) {
HttpStatus status = HttpStatus . METHOD_NOT_ALLOWED ;
return handleHttpRequestMethodNotSupported ( ( HttpRequestMethodNotSupportedException ) ex , headers , status , request ) ;
@ -181,38 +182,17 @@ public abstract class ResponseEntityExceptionHandler {
@@ -181,38 +182,17 @@ public abstract class ResponseEntityExceptionHandler {
}
else if ( ex instanceof AsyncRequestTimeoutException ) {
HttpStatus status = HttpStatus . SERVICE_UNAVAILABLE ;
return handleAsyncRequestTimeoutException (
( AsyncRequestTimeoutException ) ex , headers , status , request ) ;
return handleAsyncRequestTimeoutException ( ( AsyncRequestTimeoutException ) ex , headers , status , request ) ;
}
else {
if ( logger . isWarnEnabled ( ) ) {
logger . warn ( "Unknown exception type: " + ex . getClass ( ) . getName ( ) ) ;
}
HttpStatus status = HttpStatus . INTERNAL_SERVER_ERROR ;
return handleExceptionInternal ( ex , null , headers , status , request ) ;
// Unknown exception, typically a wrapper with a common MVC exception as cause
// (since @ExceptionHandler type declarations also match first-level causes):
// We only deal with top-level MVC exceptions here, so let's rethrow the given
// exception for further processing through the HandlerExceptionResolver chain.
throw ex ;
}
}
/ * *
* A single place to customize the response body of all Exception types .
* < p > The default implementation sets the { @link WebUtils # ERROR_EXCEPTION_ATTRIBUTE }
* request attribute and creates a { @link ResponseEntity } from the given
* body , headers , and status .
* @param ex the exception
* @param body the body for the response
* @param headers the headers for the response
* @param status the response status
* @param request the current request
* /
protected ResponseEntity < Object > handleExceptionInternal ( Exception ex , @Nullable Object body ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
if ( HttpStatus . INTERNAL_SERVER_ERROR . equals ( status ) ) {
request . setAttribute ( WebUtils . ERROR_EXCEPTION_ATTRIBUTE , ex , WebRequest . SCOPE_REQUEST ) ;
}
return new ResponseEntity < > ( body , headers , status ) ;
}
/ * *
* Customize the response for HttpRequestMethodNotSupportedException .
* < p > This method logs a warning , sets the "Allow" header , and delegates to
@ -223,8 +203,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -223,8 +203,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleHttpRequestMethodNotSupported ( HttpRequestMethodNotSupportedException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleHttpRequestMethodNotSupported (
HttpRequestMethodNotSupportedException ex , Http Headers headers , HttpStatus status , WebRequest request ) {
pageNotFoundLogger . warn ( ex . getMessage ( ) ) ;
@ -245,8 +225,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -245,8 +225,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleHttpMediaTypeNotSupported ( HttpMediaTypeNotSupportedException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleHttpMediaTypeNotSupported (
HttpMediaTypeNotSupportedException ex , Http Headers headers , HttpStatus status , WebRequest request ) {
List < MediaType > mediaTypes = ex . getSupportedMediaTypes ( ) ;
if ( ! CollectionUtils . isEmpty ( mediaTypes ) ) {
@ -265,8 +245,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -265,8 +245,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleHttpMediaTypeNotAcceptable ( HttpMediaTypeNotAcceptableException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleHttpMediaTypeNotAcceptable (
HttpMediaTypeNotAcceptableException ex , Http Headers headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -281,8 +261,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -281,8 +261,8 @@ public abstract class ResponseEntityExceptionHandler {
* @return a { @code ResponseEntity } instance
* @since 4 . 2
* /
protected ResponseEntity < Object > handleMissingPathVariable ( MissingPathVariableException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleMissingPathVariable (
MissingPathVariableException ex , HttpHeaders headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -296,8 +276,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -296,8 +276,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleMissingServletRequestParameter ( MissingServletRequestParameterException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleMissingServletRequestParameter (
MissingServletRequestParameterException ex , HttpHeaders headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -311,8 +291,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -311,8 +291,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleServletRequestBindingException ( ServletRequestBindingException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleServletRequestBindingException (
ServletRequestBindingException ex , HttpHeaders headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -326,8 +306,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -326,8 +306,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleConversionNotSupported ( ConversionNotSupportedException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleConversionNotSupported (
ConversionNotSupportedException ex , HttpHeaders headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -341,8 +321,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -341,8 +321,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleTypeMismatch ( TypeMismatchException ex , HttpHeaders headers ,
HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleTypeMismatch (
TypeMismatchException ex , HttpHeaders headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -356,8 +336,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -356,8 +336,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleHttpMessageNotReadable ( HttpMessageNotReadableException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleHttpMessageNotReadable (
HttpMessageNotReadableException ex , Http Headers headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -371,8 +351,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -371,8 +351,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleHttpMessageNotWritable ( HttpMessageNotWritableException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleHttpMessageNotWritable (
HttpMessageNotWritableException ex , Http Headers headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -386,8 +366,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -386,8 +366,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleMethodArgumentNotValid ( MethodArgumentNotValidException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleMethodArgumentNotValid (
MethodArgumentNotValidException ex , HttpHeaders headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -401,8 +381,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -401,8 +381,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleMissingServletRequestPart ( MissingServletRequestPartException ex ,
HttpHeaders headers , HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleMissingServletRequestPart (
MissingServletRequestPartException ex , HttpHeaders headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -416,8 +396,8 @@ public abstract class ResponseEntityExceptionHandler {
@@ -416,8 +396,8 @@ public abstract class ResponseEntityExceptionHandler {
* @param request the current request
* @return a { @code ResponseEntity } instance
* /
protected ResponseEntity < Object > handleBindException ( BindException ex , HttpHeaders headers ,
HttpStatus status , WebRequest request ) {
protected ResponseEntity < Object > handleBindException (
BindException ex , HttpHeaders headers , HttpStatus status , WebRequest request ) {
return handleExceptionInternal ( ex , null , headers , status , request ) ;
}
@ -467,4 +447,24 @@ public abstract class ResponseEntityExceptionHandler {
@@ -467,4 +447,24 @@ public abstract class ResponseEntityExceptionHandler {
return handleExceptionInternal ( ex , null , headers , status , webRequest ) ;
}
/ * *
* A single place to customize the response body of all Exception types .
* < p > The default implementation sets the { @link WebUtils # ERROR_EXCEPTION_ATTRIBUTE }
* request attribute and creates a { @link ResponseEntity } from the given
* body , headers , and status .
* @param ex the exception
* @param body the body for the response
* @param headers the headers for the response
* @param status the response status
* @param request the current request
* /
protected ResponseEntity < Object > handleExceptionInternal (
Exception ex , @Nullable Object body , HttpHeaders headers , HttpStatus status , WebRequest request ) {
if ( HttpStatus . INTERNAL_SERVER_ERROR . equals ( status ) ) {
request . setAttribute ( WebUtils . ERROR_EXCEPTION_ATTRIBUTE , ex , WebRequest . SCOPE_REQUEST ) ;
}
return new ResponseEntity < > ( body , headers , status ) ;
}
}