Что обычно вызывает контроллер в Spring MVC для обработки запроса?

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

Ответ

Контроллер в Spring MVC вызывает сервисный слой для выполнения бизнес-логики, а затем подготавливает данные для представления (View).

Почему так? Это следует принципу разделения ответственности (Single Responsibility Principle). Контроллер отвечает только за обработку HTTP-запроса и формирование ответа, делегируя логику приложения сервисам.

Пример для MVC (возврат представления):

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/users/{id}")
    public String getUser(@PathVariable Long id, Model model) {
        // 1. Вызов сервиса для получения данных
        User user = userService.findById(id);
        // 2. Передача данных в модель для представления
        model.addAttribute("user", user);
        // 3. Возврат имени view-шаблона
        return "userProfile";
    }
}

Пример для REST API (возврат DTO/JSON):

@RestController
public class UserApiController {
    @Autowired
    private UserService userService;

    @GetMapping("/api/users/{id}")
    public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        // Конвертация в DTO и возврат
        return ResponseEntity.ok(new UserDto(user));
    }
}

Ключевые моменты:

  • Контроллер не должен содержать бизнес-логику.
  • Зависимости (сервисы) внедряются через @Autowired или конструктор.
  • Для MVC данные передаются в объект Model.
  • Результатом может быть имя view-шаблона (MVC) или непосредственно данные (REST).