Методи, анотовані @ExceptionHandler
, @InitBinder
та @ModelAttribute
застосовуються тільки до класу, позначеного анотацією @Controller
, або до ієрархії класів, у яких оголошено. Якщо замість цього вони оголошені в класі, анотованому @ControllerAdvice
або @RestControllerAdvice
, вони застосовуються до будь-якого контролера. Ба більше, починаючи з версії 5.3, методи, анотовані @ExceptionHandler
у @ControllerAdvice
можна використовувати для обробки винятків з будь-якого позначеного анотацією @Controller
обробника або будь-якого іншого обробника.
Анотація @ControllerAdvice
мета-анотована за допомогою анотації @Component
і тому може бути зареєстрована як бін Spring через сканування компонентів. Анотація @RestControllerAdvice
мета-анотована за допомогою анотації @ControllerAdvice
та анотації @ResponseBody
, і це означає, що методи, позначені анотацією @ ExceptionHandler
, будуть мати своє значення, що повертається, візуалізується через перетворення повідомлення тіла відповіді, а не через HTML-подання.
Під час запуску RequestMappingHandlerMapping
та ExceptionHandlerExceptionResolver
виявляють забезпечені Advice біни контролера і застосовують їх під час виконання. Глобальні методи, позначені анотацією @ExceptionHandler
з @ControllerAdvice
, застосовуються після локальних, з @Controller
. І навпаки, глобальні методи з анотаціями @ModelAttribute
та @InitBinder
застосовуються перед локальними.
Анотація @ControllerAdvice
має атрибути, які дозволяють звузити набір контролерів та обробників, до яких вони застосовуються. Наприклад:
// Робимо за мету всі контролери, анотовані за допомогою @RestController
@ControllerAdvice(annotations = RestController.class)
public class ExampleAdvice1 {}
// Маємо на меті всі контролери в певних пакетах
@ControllerAdvice("org.example.controllers")
public class ExampleAdvice2 {}
// Робимо за мету всі контролери, які призначаються певним класам
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class})
public class ExampleAdvice3 {}
// Робимо за мету всі контролери, анотовані за допомогою @RestController
@ControllerAdvice(annotations = [RestController::class])
class ExampleAdvice1
// Маємо на меті всі контролери в певних пакетах
@ControllerAdvice("org.example.controllers")
class ExampleAdvice2
// Робимо за мету всі контролери, які призначаються певним класам
@ControllerAdvice(assignableTypes = [ControllerInterface::class, AbstractController::class])
class ExampleAdvice3
Селектори в попередньому прикладі обчислюються під час виконання та можуть негативно вплинути на продуктивність при широкому використанні. Детальнішу інформацію дивися в javadoc по анотації @ControllerAdvice
.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ