← Назад к вопросам
Что нужно для создания @RestController в Spring?
1.0 Junior🔥 221 комментариев
#REST API и микросервисы#Spring Framework
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Создание @RestController в Spring
@RestController — это аннотация в Spring Framework для создания REST API контроллеров. Это комбинация @Controller и @ResponseBody, которая автоматически сериализует ответы в JSON.
Основные требования
1. Spring Boot зависимость
Прежде всего, нужна зависимость Spring Web:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Или для Gradle:
implementation 'org.springframework.boot:spring-boot-starter-web'
Эта зависимость автоматически подтягивает:
- Spring MVC
- Embedded Tomcat (или другой сервер)
- Jackson для JSON сериализации
2. Создание REST контроллера
Базовый пример:
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import java.util.List;
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
// GET /api/v1/users
@GetMapping
public List<User> getAllUsers() {
return userService.findAll();
}
// GET /api/v1/users/{id}
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return userService.findById(id)
.map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.notFound().build());
}
// POST /api/v1/users
@PostMapping
public ResponseEntity<User> createUser(@RequestBody UserRequest request) {
User user = userService.create(request);
return ResponseEntity.status(201).body(user);
}
// PUT /api/v1/users/{id}
@PutMapping("/{id}")
public ResponseEntity<User> updateUser(
@PathVariable Long id,
@RequestBody UserRequest request) {
User user = userService.update(id, request);
return ResponseEntity.ok(user);
}
// DELETE /api/v1/users/{id}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.delete(id);
return ResponseEntity.noContent().build();
}
}
3. Аннотации и их роли
@RestController // Объединяет @Controller + @ResponseBody
@RequestMapping("/api/v1/products") // Базовый path для всех методов
public class ProductController {
@Autowired // Внедрение зависимости
private ProductService productService;
// HTTP методы
@GetMapping // = @RequestMapping(method = RequestMethod.GET)
@PostMapping // = @RequestMapping(method = RequestMethod.POST)
@PutMapping // = @RequestMapping(method = RequestMethod.PUT)
@DeleteMapping // = @RequestMapping(method = RequestMethod.DELETE)
@PatchMapping // = @RequestMapping(method = RequestMethod.PATCH)
// Параметры
@GetMapping("/{id}") // Path переменная
public Product getProduct(@PathVariable Long id) { }
@PostMapping // Body request
public Product create(@RequestBody ProductRequest request) { }
@GetMapping // Query параметр
public List<Product> search(@RequestParam String category) { }
@GetMapping // Header
public Product get(@RequestHeader("X-User-Id") String userId) { }
}
4. Внедрение зависимостей (Dependency Injection)
Для работы контроллера нужны сервисы:
@Service // Сервис нужно пометить как Spring bean
public class UserService {
@Autowired // Или конструктор (рекомендуется)
private UserRepository userRepository;
public List<User> findAll() {
return userRepository.findAll();
}
public User create(UserRequest request) {
User user = new User();
user.setName(request.getName());
user.setEmail(request.getEmail());
return userRepository.save(user);
}
}
@Repository // Доступ к БД
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
}
5. Конфигурация Spring Application
Обязательно иметь основной класс:
@SpringBootApplication // Объединяет @Configuration + @ComponentScan + @EnableAutoConfiguration
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
}
6. Обработка ошибок
Для корректных HTTP ответов при ошибках:
@RestControllerAdvice // Global exception handler
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(
ResourceNotFoundException ex) {
ErrorResponse error = new ErrorResponse(
404,
ex.getMessage(),
LocalDateTime.now()
);
return ResponseEntity.status(404).body(error);
}
@ExceptionHandler(ValidationException.class)
public ResponseEntity<ErrorResponse> handleValidation(
ValidationException ex) {
ErrorResponse error = new ErrorResponse(
400,
ex.getMessage(),
LocalDateTime.now()
);
return ResponseEntity.status(400).body(error);
}
}
7. Валидация данных
Для проверки входных данных:
import jakarta.validation.constraints.*;
public class UserRequest {
@NotBlank(message = "Name cannot be empty")
@Size(min = 2, max = 100)
private String name;
@NotNull(message = "Email is required")
@Email(message = "Invalid email format")
private String email;
@Min(18)
@Max(120)
private int age;
}
@RestController
public class UserController {
@PostMapping
public ResponseEntity<User> createUser(
@Valid @RequestBody UserRequest request) { // @Valid включает валидацию
// request уже проверен
return ResponseEntity.ok(userService.create(request));
}
}
8. Versioning API
Для управления версиями API:
// Вариант 1: Path versioning
@RestController
@RequestMapping("/api/v1/users")
public class UserControllerV1 { }
@RestController
@RequestMapping("/api/v2/users")
public class UserControllerV2 { }
// Вариант 2: Header versioning
@RestController
@RequestMapping("/api/users")
@CrossOrigin
public class UserController {
@GetMapping(headers = "X-API-Version=1")
public List<UserV1> getUsersV1() { }
@GetMapping(headers = "X-API-Version=2")
public List<UserV2> getUsersV2() { }
}
9. CORS (Cross-Origin Resource Sharing)
Для работы с фронтендом на другом домене:
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:3000", "https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
};
}
}
Или напрямую на контроллере:
@RestController
@RequestMapping("/api/users")
@CrossOrigin(origins = "http://localhost:3000", maxAge = 3600)
public class UserController { }
Полный пример работающего проекта
pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
</dependencies>
application.properties:
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=user
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
server.port=8080
Checklist для создания @RestController
- Spring Web зависимость добавлена
- Класс помечен @RestController
- Определён @RequestMapping path
- Сервис внедрён через @Autowired или конструктор
- Методы используют правильные HTTP методы (@GetMapping, @PostMapping и т.д.)
- Используется @Valid для валидации входных данных
- Возвращаются правильные HTTP коды (ResponseEntity)
- Реализована обработка ошибок (@ExceptionHandler)
- Настроен CORS если нужно
- Тесты написаны (MockMvc или RestAssured)
С соблюдением этих требований ты создашь чистый и масштабируемый REST API.