Ответ
Контроллер в Spring (@Controller или @RestController) должен содержать только методы для обработки HTTP-запросов. Его основная задача — быть тонким слоем между клиентом и бизнес-логикой приложения.
Что должен делать контроллер (его методы):
- Принимать HTTP-запросы, маппируя их через аннотации (
@GetMapping,@PostMappingи т.д.). - Валидировать входные данные (с помощью
@Valid). - Преобразовывать DTO (Data Transfer Object) в доменные модели и наоборот.
- Вызывать методы сервисного слоя для выполнения бизнес-логики.
- Формировать и возвращать HTTP-ответы (статусы, заголовки, тело).
Чего НЕ должно быть в контроллере:
- Прямой работы с базой данных (JPA, JDBC).
- Сложной бизнес-логики.
- Транзакционной логики (управление
@Transactional).
Пример правильно организованного REST-контроллера:
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public ResponseEntity<UserDto> getUser(@PathVariable Long id) {
UserDto user = userService.getUserById(id);
return ResponseEntity.ok(user);
}
@PostMapping
public ResponseEntity<UserDto> createUser(@Valid @RequestBody CreateUserRequest request) {
UserDto createdUser = userService.createUser(request);
return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
}
}
Такой подход обеспечивает разделение ответственности (Single Responsibility Principle) и упрощает тестирование.