|
|
|
|
@ -2749,26 +2749,27 @@ an HTTP status code.
@@ -2749,26 +2749,27 @@ an HTTP status code.
|
|
|
|
|
=== Controller Advice |
|
|
|
|
[.small]#<<web.adoc#mvc-ann-controller-advice, Same as in Spring MVC>># |
|
|
|
|
|
|
|
|
|
Typically, the `@ExceptionHandler`, `@InitBinder`, and `@ModelAttribute` methods apply within |
|
|
|
|
the `@Controller` class (or class hierarchy) in which they are declared. If you want such |
|
|
|
|
methods to apply more globally (across controllers), you can declare them in a class |
|
|
|
|
marked with `@ControllerAdvice` or `@RestControllerAdvice`. |
|
|
|
|
|
|
|
|
|
`@ControllerAdvice` is marked with `@Component`, which means that such classes can be registered |
|
|
|
|
as Spring beans through <<core.adoc#beans-java-instantiating-container-scan, component scanning>>. |
|
|
|
|
`@RestControllerAdvice` is also a meta-annotation marked with both `@ControllerAdvice` and |
|
|
|
|
`@ResponseBody`, which essentially means `@ExceptionHandler` methods are rendered to the |
|
|
|
|
response body through message conversion (versus view resolution or template rendering). |
|
|
|
|
|
|
|
|
|
On startup, the infrastructure classes for `@RequestMapping` and `@ExceptionHandler` methods |
|
|
|
|
detect Spring beans of type `@ControllerAdvice` and apply their methods at runtime. |
|
|
|
|
Global `@ExceptionHandler` methods (from a `@ControllerAdvice`) are applied *after* local |
|
|
|
|
ones (from the `@Controller`). By contrast, global `@ModelAttribute` and `@InitBinder` |
|
|
|
|
methods are applied *before* local ones. |
|
|
|
|
|
|
|
|
|
By default `@ControllerAdvice` methods apply to every request (that is, all controllers), but |
|
|
|
|
you can narrow that down to a subset of controllers through attributes on the annotation, |
|
|
|
|
as the following example shows: |
|
|
|
|
Typically, the `@ExceptionHandler`, `@InitBinder`, and `@ModelAttribute` methods apply |
|
|
|
|
within the `@Controller` class (or class hierarchy) in which they are declared. If you |
|
|
|
|
want such methods to apply more globally (across controllers), you can declare them in a |
|
|
|
|
class annotated with `@ControllerAdvice` or `@RestControllerAdvice`. |
|
|
|
|
|
|
|
|
|
`@ControllerAdvice` is annotated with `@Component`, which means that such classes can be |
|
|
|
|
registered as Spring beans through <<core.adoc#beans-java-instantiating-container-scan, |
|
|
|
|
component scanning>>. `@RestControllerAdvice` is a composed annotation that is annotated |
|
|
|
|
with both `@ControllerAdvice` and `@ResponseBody`, which essentially means |
|
|
|
|
`@ExceptionHandler` methods are rendered to the response body through message conversion |
|
|
|
|
(versus view resolution or template rendering). |
|
|
|
|
|
|
|
|
|
On startup, the infrastructure classes for `@RequestMapping` and `@ExceptionHandler` |
|
|
|
|
methods detect Spring beans annotated with `@ControllerAdvice` and then apply their |
|
|
|
|
methods at runtime. Global `@ExceptionHandler` methods (from a `@ControllerAdvice`) are |
|
|
|
|
applied _after_ local ones (from the `@Controller`). By contrast, global `@ModelAttribute` |
|
|
|
|
and `@InitBinder` methods are applied _before_ local ones. |
|
|
|
|
|
|
|
|
|
By default, `@ControllerAdvice` methods apply to every request (that is, all controllers), |
|
|
|
|
but you can narrow that down to a subset of controllers by using attributes on the |
|
|
|
|
annotation, as the following example shows: |
|
|
|
|
|
|
|
|
|
==== |
|
|
|
|
[source,java,indent=0] |
|
|
|
|
@ -2788,8 +2789,8 @@ as the following example shows:
@@ -2788,8 +2789,8 @@ as the following example shows:
|
|
|
|
|
---- |
|
|
|
|
==== |
|
|
|
|
|
|
|
|
|
The preceding selectors are evaluated at runtime and may negatively impact |
|
|
|
|
performance if you use them extensively. See the |
|
|
|
|
The selectors in the preceding example are evaluated at runtime and may negatively impact |
|
|
|
|
performance if used extensively. See the |
|
|
|
|
{api-spring-framework}/web/bind/annotation/ControllerAdvice.html[`@ControllerAdvice`] |
|
|
|
|
javadoc for more details. |
|
|
|
|
|
|
|
|
|
|