← Назад к вопросам
Как быстро сделать контроллер
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 минут.