Что возвращают методы контроллера в Spring MVC?

Ответ

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

  1. String — имя логического представления (view name) для разрешения через ViewResolver.
  2. ModelAndView — объект, содержащий и модель данных, и имя представления.
  3. ResponseEntity<T> — полный HTTP-ответ, включая статус, заголовки и тело. Используется для REST API.
  4. @ResponseBody + тип объекта — объект будет сериализован (например, в JSON/XML) и записан в тело ответа. Часто используется с аннотацией @RestController.
  5. void — если метод обрабатывает ответ напрямую через HttpServletResponse.

Примеры:

// Возврат имени представления
@GetMapping("/home")
public String home(Model model) {
    model.addAttribute("message", "Hello");
    return "homePage"; // Resolves to /WEB-INF/views/homePage.jsp
}

// Возврат данных для REST API (JSON)
@RestController
public class ApiController {
    @GetMapping("/user/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return user != null 
            ? ResponseEntity.ok(user) 
            : ResponseEntity.notFound().build();
    }
}

Ответ 18+ 🔞

А, ну вот, опять про эти ваши контроллеры в Спринге! Слушай, да тут же целый цирк с конями, блядь! Метод написал, а он тебе может нахуярить ответ кучей разных способов. Прям как в столовке — суп дадут, а можно и второе сразу в рот запихнуть, если попросить.

Смотри, какие у нас тут главные фокусы-покусы есть, ёпта:

  1. Вернуть String — это типа самый простой, деревенский способ. Сказал слово — «homePage» — и фреймворк, этот хитрожопый ViewResolver, сам побежит искать, где у тебя эта jsp-шка или шаблон заныкан. Как почтальон Печкин с посылкой, только без велосипеда.

  2. Вернуть ModelAndView — это уже для продвинутых, кто любит всё и сразу. Засунул в один объект и данные (модель), и название вьюхи. Удобно, блядь, не надо по углам раскидывать. Как чемодан со всем скарбом — приехал и сразу жить можно.

  3. Вернуть ResponseEntity<T> — о, это уже наш ответ Чемберлену, для REST API! Тут тебе и статус код на выбор (200, 404, 500 — что душа пожелает), и заголовки любые прилепить можно, и тело ответа. Полный контроль, мать его! Хочешь — JSON отдашь, хочешь — просто NOT_FOUND() и пошёл нахуй клиента.

  4. Вернуть любой объект с @ResponseBody — это магия, ёбана! Написал return user;, а Спринг, сука, сам его в JSON превратит и в ответ сунет. Особенно если весь контроллер пометил @RestController — тогда вообще красота, все методы так работают. Лень — двигатель прогресса, блядь!

  5. Вернуть void — это когда ты такой: «Отстаньте все, я сам всё сделаю!». И лезешь напрямую в HttpServletResponse, чтоб писать в него что взбредёт. Свобода, конечно, но и отвественность, блядь, полная. Накосячил — сам и расхлёбывай.

Ну и смотри, как это в коде выглядит, чтоб не быть, как тот Герасим, который только «Му-му» мычит:

// Самый простой — сказал слово и пошёл пить чай
@GetMapping("/home")
public String home(Model model) {
    model.addAttribute("message", "Привет, мир, ёпта!");
    return "homePage"; // А ViewResolver уже бежит искать homePage.jsp
}

// А это для апишки — серьёзно, с покер-фейсом
@RestController
public class ApiController {
    @GetMapping("/user/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        // Если нашёл — ок, не нашёл — 404, и нехуй тут
        return user != null 
            ? ResponseEntity.ok(user) 
            : ResponseEntity.notFound().build();
    }
}

Вот и вся магия, блядь. Главное — не запутаться, какой способ когда юзать. А то получится как в том анекдоте: «Хотел сделать хорошо, а получилось как всегда».