Что такое HandlerAdapter в Spring MVC и для чего он нужен?

«Что такое HandlerAdapter в Spring MVC и для чего он нужен?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HandlerAdapter — это ключевой интерфейс в архитектуре Spring MVC, который выступает в роли посредника между DispatcherServlet и произвольным обработчиком запроса (handler). Его основная задача — инкапсулировать логику вызова обработчика.

Проблема, которую он решает: DispatcherServlet получает запрос и находит подходящий обработчик (HandlerMapping), но не знает, как именно его выполнить, так как обработчики могут быть разными: аннотированные @Controller методы, реализации интерфейса Controller, Servlet'ы и др.

Принцип работы:

  1. DispatcherServlet запрашивает у каждого HandlerAdapter: "Можешь ли ты выполнить этот обработчик?" (supports(handler)).
  2. Первый подошедший HandlerAdapter берет на себя ответственность:
    • Преобразует данные HTTP-запроса (параметры, тело, заголовки) в аргументы метода (@RequestParam, @RequestBody, Model).
    • Вызывает метод обработчика.
    • Обрабатывает возвращаемое значение (String, ModelAndView, ResponseEntity) в объект ModelAndView для дальнейшей обработки ViewResolver'ом.

Основные реализации:

  • RequestMappingHandlerAdapter — для современных контроллеров с аннотациями @RequestMapping (т.е. @Controller / @RestController). Самый часто используемый.
  • SimpleControllerHandlerAdapter — для legacy-контроллеров, реализующих интерфейс Controller.
  • HttpRequestHandlerAdapter — для обработчиков, реализующих HttpRequestHandler (например, для обработки статических ресурсов).

Почему это важно? Паттерн Adapter делает архитектуру Spring MVC расширяемой. Вы можете подключить свою собственную логику обработки запросов, просто реализовав интерфейс HandlerAdapter.