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

Как быстро сделать контроллер

1.6 Junior🔥 181 комментариев
#REST API и микросервисы#Spring Boot и Spring Data#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Быстрое создание REST контроллера в Spring Boot

Минимальный контроллер (2 минуты)

Шаг 1: Создать класс контроллера

package com.example.controllers;

import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.ArrayList;

@RestController
@RequestMapping("/api/v1/users")
public class UserController {
    
    // Временное хранилище (для быстрого прототипирования)
    private List<User> users = new ArrayList<>();
    
    // GET: получить всех
    @GetMapping
    public List<User> getAllUsers() {
        return users;
    }
    
    // GET: получить по ID
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return users.stream()
            .filter(u -> u.getId().equals(id))
            .findFirst()
            .orElse(null);
    }
    
    // POST: создать
    @PostMapping
    public User createUser(@RequestBody User user) {
        users.add(user);
        return user;
    }
    
    // PUT: обновить
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        users.removeIf(u -> u.getId().equals(id));
        users.add(user);
        return user;
    }
    
    // DELETE: удалить
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        users.removeIf(u -> u.getId().equals(id));
    }
}

Шаг 2: Модель (Entity/DTO)

package com.example.models;

public class User {
    private Long id;
    private String name;
    private String email;
    
    // Конструкторы
    public User() {}
    public User(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }
    
    // Getters/Setters
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

Контроллер с БД (5 минут)

Добавить зависимости в pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

Repository (интерфейс)

package com.example.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.models.User;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // JPA даёт нам findAll(), findById(), save(), delete() бесплатно!
}

Entity с БД

package com.example.models;

import jakarta.persistence.*;

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false)
    private String name;
    
    @Column(nullable = false, unique = true)
    private String email;
    
    // Конструкторы, getters, setters...
}

Контроллер с БД

package com.example.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.example.models.User;
import com.example.repositories.UserRepository;
import java.util.List;

@RestController
@RequestMapping("/api/v1/users")
public class UserController {
    
    @Autowired
    private UserRepository repository;
    
    @GetMapping
    public List<User> getAllUsers() {
        return repository.findAll();
    }
    
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return repository.findById(id).orElse(null);
    }
    
    @PostMapping
    public User createUser(@RequestBody User user) {
        return repository.save(user);
    }
    
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        return repository.save(user);
    }
    
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        repository.deleteById(id);
    }
}

application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=postgres
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

Контроллер с валидацией (7 минут)

Зависимость:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Entity с валидацией

import jakarta.validation.constraints.*;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @NotBlank(message = "Имя не может быть пусто")
    @Size(min = 2, max = 100)
    private String name;
    
    @NotBlank(message = "Email не может быть пусто")
    @Email(message = "Email должен быть валидным")
    private String email;
}

Контроллер с валидацией

@PostMapping
public User createUser(@Valid @RequestBody User user) {
    // @Valid автоматически проверит User
    return repository.save(user);
}

// Exception handler для ошибок валидации
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleValidationErrors(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new HashMap<>();
    ex.getBindingResult().getFieldErrors().forEach(error -> 
        errors.put(error.getField(), error.getDefaultMessage())
    );
    return ResponseEntity.badRequest().body(errors);
}

Контроллер с сервисом (8 минут)

Service слой

package com.example.services;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.models.User;
import com.example.repositories.UserRepository;
import java.util.List;
import java.util.Optional;

@Service
public class UserService {
    
    @Autowired
    private UserRepository repository;
    
    public List<User> getAllUsers() {
        return repository.findAll();
    }
    
    public Optional<User> getUserById(Long id) {
        return repository.findById(id);
    }
    
    public User createUser(User user) {
        // Можно добавить бизнес-логику
        if (repository.findByEmail(user.getEmail()).isPresent()) {
            throw new RuntimeException("Email уже существует");
        }
        return repository.save(user);
    }
    
    public User updateUser(Long id, User user) {
        user.setId(id);
        return repository.save(user);
    }
    
    public void deleteUser(Long id) {
        repository.deleteById(id);
    }
}

Тонкий контроллер (только маршруты)

@RestController
@RequestMapping("/api/v1/users")
public class UserController {
    
    @Autowired
    private UserService service;
    
    @GetMapping
    public List<User> getAllUsers() {
        return service.getAllUsers();
    }
    
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return service.getUserById(id)
            .orElseThrow(() -> new RuntimeException("User not found"));
    }
    
    @PostMapping
    public User createUser(@Valid @RequestBody User user) {
        return service.createUser(user);
    }
    
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @Valid @RequestBody User user) {
        return service.updateUser(id, user);
    }
    
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        service.deleteUser(id);
    }
}

Чеклист для быстрого создания

1. (1 мин) Создать class контроллера

@RestController
@RequestMapping("/api/v1/resource")
public class ResourceController { }

2. (1 мин) Добавить Repository (если есть БД)

@Autowired
private ResourceRepository repository;

3. (2 мин) Добавить основные методы

@GetMapping
@PostMapping
@PutMapping("/{id}")
@DeleteMapping("/{id}")

4. (1 мин) Добавить валидацию

@Valid @RequestBody Resource resource

5. (1 мин) Exception handling (если нужно)

@ExceptionHandler

Pro Tips для скорости

1. Используйте IDE генерацию

IntelliJ IDEA:
- Code → Generate → Constructor/Getter/Setter (Alt+Insert)
- Spring Boot плагин генерирует много boilerplate

2. Lombok для меньше кода

@Data // @Getter @Setter @ToString @EqualsAndHashCode @RequiredArgsConstructor
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private String email;
}

3. Spring Boot стартер проекта

https://start.spring.io/
- Выберите зависимости
- Скачайте готовый проект
- Начните разработку за 10 секунд

Вывод

Время создания REST контроллера:

  • Минимальный (in-memory): 2-3 минуты
  • С БД: 5 минут
  • С валидацией и сервисом: 8-10 минут

Spring Boot значительно ускоряет разработку благодаря:

  • Auto-configuration (сама настраивает)
  • Starter dependencies (зависимости готовы)
  • Data JPA (JpaRepository даёт CRUD бесплатно)
  • Validation (встроенная валидация)

Можно создать production-ready контроллер буквально за 10 минут.