Controllers

Базовый Spring
≈ 1 мин чтения

Контроллер как адаптер между HTTP и приложением

В Spring MVC controller — Spring bean, методы которого могут обрабатывать web-запросы. Он получает данные в форме, удобной для Java-кода, вызывает нужные сервисы и возвращает результат, который Spring MVC затем превращает в HTTP-ответ.

@Controller
class ProductController {

    private final ProductService productService;

    ProductController(ProductService productService) {
        this.productService = productService;
    }

    @GetMapping("/products")
    String products(Model model) {
        model.addAttribute("products", productService.findAll());
        return "products";
    }
}

Аннотация @Controller делает класс кандидатом на роль MVC-контроллера. В примере метод получает данные у сервиса, кладёт их в Model и возвращает имя представления. Сам контроллер не отвечает за создание сервиса и не должен переносить в себя его бизнес-логику.

Почему контроллеры лучше держать тонкими

Если контроллер начинает рассчитывать цены, управлять транзакциями или содержать сложные правила предметной области, web-слой быстро становится трудно переиспользовать и тестировать. Обычно контроллеру достаточно прочитать входные данные, вызвать подходящую операцию приложения и сформировать web-результат.

@Controller не означает автоматически «вернуть JSON». Работа с телом HTTP-ответа и специальный вариант контроллера для REST будут разобраны дальше.