Какие типы данных может возвращать метод контроллера в Spring MVC?

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

Ответ

Методы контроллера Spring MVC могут возвращать различные типы, которые Spring автоматически преобразует в HTTP-ответ. Основные категории:

1. Простые типы и объекты (для REST API)

  • Примитивы и String: Возвращаемое значение становится телом ответа.
    @GetMapping("/status") public String status() { return "OK"; }
  • Произвольные объекты и коллекции: Автоматически сериализуются в JSON/XML (через HttpMessageConverter).
    @GetMapping("/users") public List<User> getUsers() { /*...*/ }

2. ResponseEntity<T> (Полный контроль над ответом)

  • Позволяет явно задать статус код, заголовки и тело ответа.
    @GetMapping("/user/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = service.findById(id);
        return user != null
                ? ResponseEntity.ok(user)
                : ResponseEntity.notFound().build();
    }

3. Типы для работы с View (шаблонизаторы)

  • String: Интерпретируется как имя представления (view name) для Thymeleaf, JSP и др.
    @GetMapping("/home") public String homePage(Model model) { return "index"; }
  • ModelAndView: Контейнер для передачи и модели данных, и имени представления.

4. Специальные типы

  • void: Если метод сам записывает ответ в HttpServletResponse.
  • HttpEntity<T>: Аналогично ResponseEntity, но без управления статусом.

Ключевой механизм: Преобразование типа возвращаемого значения в HTTP-ответ выполняется с помощью HandlerMethodReturnValueHandler. Для REST API наиболее часто используются @ResponseBody (или @RestController) с объектами и ResponseEntity.