[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kak-obrabatyvat-isklyucheniya-v-spring-mvc-chto-takoe-exceptionhandler-i-controlleradvice":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},645,"kak-obrabatyvat-isklyucheniya-v-spring-mvc-chto-takoe-exceptionhandler-i-controlleradvice",14,"spring","Spring","🌱","Как обрабатывать исключения в Spring MVC? Что такое @ExceptionHandler и @ControllerAdvice?","Spring MVC предоставляет механизм обработки исключений на разных уровнях. `@ExceptionHandler` обрабатывает исключения в одном контроллере. `@ControllerAdvice` -- глобально для всех контроллеров.\n\n\u003Cdetails>\n\u003Csummary>Глобальный обработчик исключений\u003C\u002Fsummary>\n\n```java\n@RestControllerAdvice\npublic class GlobalExceptionHandler {\n\n    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);\n\n    @ExceptionHandler(EntityNotFoundException.class)\n    public ResponseEntity\u003CErrorResponse> handleNotFound(EntityNotFoundException ex) {\n        ErrorResponse error = new ErrorResponse(\"NOT_FOUND\", ex.getMessage());\n        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);\n    }\n\n    @ExceptionHandler(MethodArgumentNotValidException.class)\n    public ResponseEntity\u003CErrorResponse> handleValidation(MethodArgumentNotValidException ex) {\n        List\u003CString> errors = ex.getBindingResult().getFieldErrors().stream()\n                .map(e -> e.getField() + \": \" + e.getDefaultMessage())\n                .collect(Collectors.toList());\n        ErrorResponse error = new ErrorResponse(\"VALIDATION_ERROR\", \"Ошибка валидации\", errors);\n        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);\n    }\n\n    @ExceptionHandler(AccessDeniedException.class)\n    public ResponseEntity\u003CErrorResponse> handleAccessDenied(AccessDeniedException ex) {\n        return ResponseEntity.status(HttpStatus.FORBIDDEN)\n                .body(new ErrorResponse(\"ACCESS_DENIED\", \"Доступ запрещён\"));\n    }\n\n    @ExceptionHandler(Exception.class)\n    public ResponseEntity\u003CErrorResponse> handleGeneral(Exception ex) {\n        log.error(\"Неожиданная ошибка\", ex);\n        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)\n                .body(new ErrorResponse(\"INTERNAL_ERROR\", \"Внутренняя ошибка сервера\"));\n    }\n}\n\npublic class ErrorResponse {\n    private String code;\n    private String message;\n    private List\u003CString> details;\n    private LocalDateTime timestamp = LocalDateTime.now();\n}\n```\n\n\u003C\u002Fdetails>\n\n### Ограничение области действия\n\n```java\n@RestControllerAdvice(basePackages = \"com.example.api\")\npublic class ApiExceptionHandler { }\n```\n\n> **На собеседовании:** покажите умение создать полноценный GlobalExceptionHandler с обработкой валидации, not found и fallback для всех исключений. Частая ошибка -- не создавать обработчик `Exception.class` (Spring вернёт stack trace, раскрывая внутреннюю структуру приложения).","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Как обрабатывать исключения в Spring MVC? Что такое @Excepti — Gymterview","Spring MVC предоставляет механизм обработки исключений на разных уровнях. `@ExceptionHandler` обрабатывает исключения в одном контроллере. `@ControllerAdvice` -","Spring MVC предоставляет механизм обработки исключений на разных уровнях. `@ExceptionHandler` обрабатывает исключения в ",[7,13],"Spring MVC предоставляет механизм обработки исключений на разных уровнях. `@ExceptionHandler` обрабатывает исключения в одном контроллере. `@ControllerAdvice` -- глобально для всех контроллеров.",true]