офлайн
офлайн
ГлавнаяSpring MVC, REST и валидация.md
---
tags: [spring, spring-mvc]
created: 2026-11-05
updated: 
---

Spring MVC, REST и валидация

Springspringspring-mvc3 мин
Содержание

› Архитектура Spring MVC (DispatcherServlet)

Spring MVC построен на паттерне Front Controller. Все входящие HTTP-запросы сначала попадают в один главный сервлет — DispatcherServlet.

Жизненный цикл обработки HTTP-запроса:

  1. Запрос: Клиент отправляет HTTP-запрос (например, GET /users/1). Запрос перехватывается DispatcherServlet.
  2. Маршрутизация (HandlerMapping): DispatcherServlet обращается к HandlerMapping. Тот ищет в реестре контроллеров метод, помеченный аннотацией @GetMapping("/users/{id}"), и возвращает HandlerExecutionChain (сам метод контроллера + список перехватчиков/интерцепторов).
  3. Адаптер (HandlerAdapter): DispatcherServlet передает запрос в HandlerAdapter. Адаптер берет сырой HTTP-запрос, извлекает из него параметры (Path Variables, Query Params, Body), конвертирует их в Java-объекты (например, через Jackson) и вызывает твой метод в контроллере.
  4. Выполнение: Твой метод отрабатывает (идет в Service, БД) и возвращает результат (объект или DTO).
  5. Конвертация ответа (HttpMessageConverter): Если метод помечен @ResponseBody (или класс помечен @RestController), DispatcherServlet передает возвращенный Java-объект в HttpMessageConverter (обычно MappingJackson2HttpMessageConverter), который сериализует объект в JSON и записывает в тело HTTP-ответа.

› REST (Representational State Transfer)

REST — это архитектурный стиль для проектирования сетевых API.

Основные принципы RESTful API:

  1. Client-Server: Разделение интерфейса (фронтенд) и хранения данных (бэкенд).
  2. Stateless (Без состояния): Сервер не хранит состояние сессии клиента между запросами. Каждый запрос должен содержать всю информацию, необходимую для его выполнения (например, JWT-токен).
  3. Cacheable: Ответы сервера должны явно указывать, можно ли их кэшировать.
  4. Uniform Interface (Единообразный интерфейс):
    • Идентификация ресурсов через URI (существительные во множественном числе: /users, /orders).
    • Манипуляция ресурсами через стандартные HTTP-методы.

HTTP-методы и их семантика:

  • GET — получение ресурса. Идемпотентный (повторный вызов не меняет состояние сервера) и Безопасный (не меняет данные).
  • POST — создание нового ресурса. Не идемпотентный (два вызова создадут два ресурса).
  • PUT — полное обновление ресурса (или создание, если его нет). Идемпотентный (повторный вызов оставит ресурс в том же состоянии).
  • PATCH — частичное обновление ресурса. (Обычно не идемпотентный, зависит от реализации).
  • DELETE — удаление ресурса. Идемпотентный.

› Основные аннотации Spring MVC

  • @Controller vs @RestController:
    • @Controller используется для классического MVC (возвращает имя HTML-шаблона, например Thymeleaf, который рендерится на сервере).
    • @RestController = @Controller + @ResponseBody. Все методы автоматически сериализуют возвращаемый объект в JSON/XML и пишут в тело ответа.
  • @RequestMapping (и его шорткаты @GetMapping, @PostMapping и т.д.) — маппинг URL на метод.
  • Извлечение данных из запроса:
    • @PathVariable — извлекает переменную из пути URL (/users/{id}).
    • @RequestParam — извлекает параметры запроса (Query parameters: /users?role=admin).
    • @RequestBody — десериализует тело HTTP-запроса (JSON) в Java-объект.
    • @RequestHeader — извлекает HTTP-заголовки.

› Валидация (Bean Validation / Hibernate Validator)

В Spring Boot валидация подключается через стартер spring-boot-starter-validation.

Как работает:

  1. В DTO-классе (Data Transfer Object) поля помечаются аннотациями: @NotNull, @NotBlank (для строк, проверяет что не null и не состоит только из пробелов), @Size(min=2, max=50), @Email, @Min, @Max.
  2. В контроллере перед параметром @RequestBody ставится аннотация @Valid (или @Validated).
  3. Когда Spring десериализует JSON в объект, он прогоняет его через валидатор. Если есть ошибки, метод контроллера не вызывается, а Spring автоматически выбрасывает MethodArgumentNotValidException и возвращает клиенту HTTP статус 400 Bad Request.

› Обработка исключений (Exception Handling)

Вместо того чтобы писать try-catch в каждом методе контроллера, в Spring используется глобальный перехватчик исключений (AOP-подход).

  • @ControllerAdvice / @RestControllerAdvice: Класс, помеченный этой аннотацией, перехватывает исключения, выброшенные из любого контроллера.
  • @ExceptionHandler(MyCustomException.class): Метод внутри Advice-класса. Если где-то в приложении (в сервисе или контроллере) вылетит MyCustomException, Spring прервет выполнение и передаст управление в этот метод.
  • Зачем нужно: Позволяет централизованно формировать красивый и стандартизированный JSON-ответ с ошибкой (например, поля timestamp, status, message, path) и правильным HTTP-статусом (через @ResponseStatus).

Ссылаются сюда 1

main48 заметок531 слов3 мин чтения