@Target(value=TYPE) @Retention(value=RUNTIME) @Documented @Component public @interface ControllerAdvice
Serves as a specialization of @Component
, allowing for
implementation classes to be autodetected through classpath scanning.
It is typically used to define @ExceptionHandler
,
@InitBinder
, and @ModelAttribute
methods that apply to all @RequestMapping
methods.
One of annotations()
, basePackageClasses()
,
basePackages()
or its alias value()
may be specified to define specific subsets of Controllers
to assist. When multiple selectors are applied, OR logic is applied -
meaning selected Controllers should match at least one selector.
The default behavior (i.e. if used without any selector),
the @ControllerAdvice
annotated class will
assist all known Controllers.
Note that those checks are done at runtime, so adding many attributes and using multiple strategies may have negative impacts (complexity, performance).
Modifier and Type | Optional Element and Description |
---|---|
java.lang.Class<? extends java.lang.annotation.Annotation>[] |
annotations
Array of annotations.
|
java.lang.Class<?>[] |
assignableTypes
Array of classes.
|
java.lang.Class<?>[] |
basePackageClasses
Type-safe alternative to
value() for specifying the packages
to select Controllers to be assisted by the @ControllerAdvice
annotated class. |
java.lang.String[] |
basePackages
Array of base packages.
|
java.lang.String[] |
value
Alias for the
basePackages() attribute. |
@AliasFor(value="basePackages") public abstract java.lang.String[] value
basePackages()
attribute.
Allows for more concise annotation declarations e.g.:
@ControllerAdvice("org.my.pkg")
is equivalent to
@ControllerAdvice(basePackages="org.my.pkg")
.
basePackages()
@AliasFor(value="value") public abstract java.lang.String[] basePackages
Controllers that belong to those base packages or sub-packages thereof
will be included, e.g.: @ControllerAdvice(basePackages="org.my.pkg")
or @ControllerAdvice(basePackages={"org.my.pkg", "org.my.other.pkg"})
.
value()
is an alias for this attribute, simply allowing for
more concise use of the annotation.
Also consider using basePackageClasses()
as a type-safe
alternative to String-based package names.
public abstract java.lang.Class<?>[] basePackageClasses
value()
for specifying the packages
to select Controllers to be assisted by the @ControllerAdvice
annotated class.
Consider creating a special no-op marker class or interface in each package that serves no purpose other than being referenced by this attribute.
public abstract java.lang.Class<?>[] assignableTypes
Controllers that are assignable to at least one of the given types
will be assisted by the @ControllerAdvice
annotated class.
public abstract java.lang.Class<? extends java.lang.annotation.Annotation>[] annotations
Controllers that are annotated with this/one of those annotation(s)
will be assisted by the @ControllerAdvice
annotated class.
Consider creating a special annotation or use a predefined one,
like @RestController
.