Ответ
Обе аннотации отмечают класс как компонент, обрабатывающий HTTP-запросы, но предназначены для разных архитектурных стилей.
| Аспект | @Controller |
@RestController |
|---|---|---|
| Назначение | Часть паттерна MVC (Model-View-Controller). | Для создания RESTful веб-сервисов (API). |
| Возвращаемое значение | Имя представления (view), например, "home.html". |
Данные (объект), которые сериализуются в JSON/XML и отправляются в теле HTTP-ответа. |
| Аннотации по умолчанию | Только @Controller. |
@Controller + @ResponseBody на уровне класса. |
| Типичный Content-Type | text/html (для рендеринга HTML). |
application/json. |
Пример @Controller (MVC с представлением):
@Controller
public class WebController {
@GetMapping("/greeting")
public String greeting(Model model) {
model.addAttribute("name", "World");
return "greeting"; // Имя шаблона (greeting.html)
}
@GetMapping("/api/old")
@ResponseBody // Без этого вернется строка как имя шаблона
public String getData() {
return "Data";
}
}
Пример @RestController (REST API):
@RestController
@RequestMapping("/api/users")
public class UserApiController {
@GetMapping
public List<User> getAllUsers() {
// Автоматически конвертируется в JSON
return userService.findAll();
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
User saved = userService.save(user);
return ResponseEntity.created(URI.create("/api/users/" + saved.getId())).body(saved);
}
}
Вывод: Используйте @Controller для server-side рендеринга HTML, а @RestController — для построения JSON/XML API.