Какие знаешь аннотация для создания контроллера?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Аннотации для создания контроллера в Spring
В Spring Framework существует несколько аннотаций для создания контроллеров. Выбор зависит от типа приложения и требуемого функционала. Рассмотрю основные и их отличия.
1. @Controller — базовая аннотация
Это классическая аннотация для веб-контроллеров, которые возвращают представления (Views):
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/list")
public String listUsers(Model model) {
List<User> users = userService.getAllUsers();
model.addAttribute("users", users);
return "users/list"; // Имя шаблона
}
@GetMapping("/{id}")
public String showUser(@PathVariable Long id, Model model) {
User user = userService.getUserById(id);
model.addAttribute("user", user);
return "users/detail";
}
}
Особенности: Возвращает логическое имя представления (String, View). Spring ищет соответствующий шаблон (JSP, Thymeleaf и т.д.). Требует ViewResolver для разрешения имён представлений.
2. @RestController — для REST API
Специализированная аннотация для создания REST контроллеров, которые возвращают JSON/XML данные:
@RestController
@RequestMapping("/api/v1/users")
public class UserRestController {
@Autowired
private UserService userService;
@GetMapping
public List<UserDTO> getAllUsers() {
return userService.getAllUsersAsDTO();
}
@GetMapping("/{id}")
public UserDTO getUserById(@PathVariable UUID id) {
return userService.getUserDTOById(id);
}
@PostMapping
public ResponseEntity<UserDTO> createUser(@RequestBody CreateUserRequest request) {
UserDTO created = userService.create(request);
return ResponseEntity.status(HttpStatus.CREATED).body(created);
}
@PutMapping("/{id}")
public UserDTO updateUser(@PathVariable UUID id, @RequestBody UpdateUserRequest request) {
return userService.update(id, request);
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable UUID id) {
userService.delete(id);
return ResponseEntity.noContent().build();
}
}
Особенности: Автоматически сериализует объекты в JSON/XML. Возвращаемые объекты преобразуются в тело ответа. Не нужен ViewResolver. Эквивалентен @Controller + @ResponseBody на методах.
3. @Repository — для доступа к данным
Хотя это не контроллер, часто путают. Используется для слоя доступа к данным:
@Repository
public class UserRepository extends JpaRepository<User, UUID> {
User findByEmail(String email);
List<User> findByStatusAndCreatedDateAfter(UserStatus status, LocalDateTime date);
}
4. @Service — для бизнес-логики
Также не контроллер, но важен для архитектуры:
@Service
@Transactional
public class UserService {
@Autowired
private UserRepository userRepository;
public UserDTO getUserDTOById(UUID id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new EntityNotFoundException("User not found"));
return convertToDTO(user);
}
}
5. @Component — универсальная аннотация
Базовая аннотация Spring, которая может использоваться для любого bean'а:
@Component
public class CustomController {
@RequestMapping("/custom")
public String handle() {
return "response";
}
}
Отличия между аннотациями
@Controller — Возвращает View/String (имя шаблона) для MVC приложений с HTML.
@RestController — Возвращает JSON/XML объекты для REST API и микросервисов.
@Repository — Слой доступа к БД, возвращает сущности/коллекции.
@Service — Бизнес-логика, возвращает любые значения.
@Component — Общий компонент, редко для контроллеров.
Комбинированный пример архитектуры
@RestController
@RequestMapping("/api/v1/products")
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("/{id}")
public ProductDTO getProduct(@PathVariable UUID id) {
return productService.getProductDTO(id);
}
}
@Service
@Transactional
public class ProductService {
@Autowired
private ProductRepository productRepository;
public ProductDTO getProductDTO(UUID id) {
Product product = productRepository.findById(id)
.orElseThrow(() -> new NotFoundException("Product not found"));
return convertToDTO(product);
}
}
@Repository
public class ProductRepository extends JpaRepository<Product, UUID> {
Product findByCode(String code);
}
Рекомендации
Используй @Controller когда нужно возвращать HTML страницы. Используй @RestController когда разрабатываешь REST API. Всегда используй @Service для бизнес-логики. Используй @Repository для взаимодействия с БД. @Component редко нужен для контроллеров.
В современной разработке Java @RestController доминирует благодаря популярности REST API и микросервисной архитектуры.