junior
В чём разница между @Controller и @RestController?
@Controller – аннотация для контроллеров, возвращающих представления (HTML через шаблонизаторы). @RestController – комбинация @Controller + @ResponseBody, где каждый метод автоматически сериализует объект в тело HTTP-ответа (JSON по умолчанию).
| Аспект | @Controller | @RestController |
|---|---|---|
| Возвращает | Имя view (String) | Объект (-> JSON) |
| @ResponseBody | Нужно добавить явно | Включено по умолчанию |
| Применение | SSR (Thymeleaf, JSP) | REST API |
| Content-Type | text/html | application/json |
Пример
@Controller
public class PageController {
@GetMapping("/users")
public String usersPage(Model model) {
model.addAttribute("users", userService.findAll());
return "users"; // имя шаблона templates/users.html
}
}
@RestController
@RequestMapping("/api/users")
public class UserRestController {
@GetMapping
public List<UserDto> getAllUsers() {
return userService.findAll(); // автоматически в JSON
}
}
На собеседовании:
@RestController=@Controller+@ResponseBodyна каждом методе. Частая ошибка – использовать@RestControllerи пытаться вернуть имя view (Spring вернёт строку как JSON, а не отрендерит шаблон).