← Назад к вопросам

Что нужно для создания @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.

Что нужно для создания @RestController в Spring? | PrepBro