| Entity | Таблица | Описание |
|---|---|---|
Author |
authors |
Автор книг |
Book |
books |
Книга |
BookDetail |
book_details |
Детали книги (страницы, язык, аннотация) |
- One-to-Many:
Author→Book(у одного автора много книг) - One-to-One:
Book↔BookDetail(у каждой книги одна деталь)
Полный CRUD (Create, Read, Update, Delete) для всех трёх сущностей через REST API.
ResourceNotFoundException— 404, ресурс не найденDuplicateResourceException— 409, дубликат (ISBN / BookDetail)GlobalExceptionHandler(@RestControllerAdvice) — обработка всех ошибок
- Стандартная Jakarta Bean Validation —
@NotBlank,@Size,@Min,@Max,@NotNullв DTO - Кастомная валидация — аннотация
@ValidIsbnсIsbnValidator(проверка формата ISBN-13)
mvn spring-boot:runПриложение запустится на http://localhost:8080. H2 консоль: http://localhost:8080/h2-console.
POST /api/authors — создать автора
GET /api/authors — все авторы
GET /api/authors/{id} — автор по id
PUT /api/authors/{id} — обновить автора
DELETE /api/authors/{id} — удалить автора
POST /api/books — создать книгу
GET /api/books — все книги
GET /api/books/{id} — книга по id
PUT /api/books/{id} — обновить книгу
DELETE /api/books/{id} — удалить книгу
POST /api/book-details — создать деталь
GET /api/book-details — все детали
GET /api/book-details/{id} — деталь по id
GET /api/book-details/by-book/{bookId} — деталь по bookId
PUT /api/book-details/{id} — обновить деталь
DELETE /api/book-details/{id} — удалить деталь
curl -X POST http://localhost:8080/api/authors \
-H "Content-Type: application/json" \
-d '{"firstName":"Лев","lastName":"Толстой","country":"Russia"}'curl -X POST http://localhost:8080/api/books \
-H "Content-Type: application/json" \
-d '{"title":"Война и мир","isbn":"978-5-17-090636-2","year":1869,"authorId":1}'curl -X POST http://localhost:8080/api/book-details \
-H "Content-Type: application/json" \
-d '{"pageCount":1225,"language":"Russian","summary":"Эпический роман","bookId":1}'curl -X POST http://localhost:8080/api/books \
-H "Content-Type: application/json" \
-d '{"title":"","isbn":"bad-isbn","year":1200,"authorId":1}'Ответ 400:
{
"status": 400,
"message": "Validation failed",
"errors": {
"title": "Title is required",
"isbn": "ISBN must be in format XXX-X-XX-XXXXXX-X (13 digits with hyphens)",
"year": "Year must be after 1450"
}
}src/main/java/com/example/library/
├── LibraryApplication.java
├── entity/ — Author, Book, BookDetail
├── dto/ — AuthorDto, BookDto, BookDetailDto
├── repository/ — JPA репозитории
├── service/ — бизнес-логика + маппинг
├── controller/ — REST контроллеры
├── exception/ — ResourceNotFoundException, DuplicateResourceException, GlobalExceptionHandler
└── validation/ — @ValidIsbn + IsbnValidator (кастомная валидация)