Spring boot REST api, передайте id на внешний ключ вместо всего объекта - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь создать REST API с загрузочным приложением Spring для веб-приложений и мобильных приложений.В моем приложении у меня есть несколько внешних ключей, и я хочу передать только идентификатор объекта вместо всего объекта.См. Пример ниже.

Модель книги

// imports

@Entity
public class Book {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String title;
    private String isbn;

    @ManyToOne
    @JoinColumn(name = "category_id", updatable = false)
    private BookCategory bookCategory;

    public Book() {
    }

    public Book(Integer id, String title, String isbn, BookCategory bookCategory) {
        this.id = id;
        this.title = title;
        this.isbn = isbn;
        this.bookCategory = bookCategory;
    }

    // getters and setters
}

Категория модели

// imports

@Entity
public class BookCategory {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    @OneToMany(mappedBy = "bookCategory", cascade = CascadeType.ALL)
    private List<Book> books;

    public BookCategory() {
    }

    public BookCategory(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    // getters and setters
}

Book Controller

// imports

@RestController
@RequestMapping(path = "/api/v1")
public class BookController {

    @Autowired
    private BookRepository bookRepository;

    // other methods for index, show, put and delete

    @PostMapping(path = "/books")
    public book createBook(@RequestBody Book book) {
        return bookRepository.save(book);
    }

}

Хранилище книг

// imports

public interface BookRepository extends PagingAndSortingRepository<Book, Integer> {
}

Категории книг предварительно загружены в базу данных, и я не хочу позволять клиенту изменять ихили добавить новые.

Вот JOST POST, который я пробовал, и объект, который был сохранен в базе данных.

Запрос

{
    "title": "Tirant lo blanc",
    "isbn": "9788475841199",
    "category_id": 4
}

Ответ

{
    "title": "Tirant lo blanc",
    "isbn": "9788475841199",
    "bookCategory": null
}

Я тоже пытался отправить его как объект, но результат нулевой.

{
    "title": "Tirant lo blanc",
    "isbn": "9788475841199",
    "category_id": {
        "id": 4
    }
}

Как я могу отправить идентификатор категории, чтобы правильно сохранить книгу в базе данных?Лучше вместо этого отправить весь объект категории?Я тоже пытался, но ответ и сохраненная книга в базе данных всегда находятся в категории null.

1 Ответ

0 голосов
/ 02 марта 2019

Существует очень простое решение вашей проблемы.В хорошем дизайне REST API вы не позволяете пользователям API манипулировать объектами базы данных.Вместо этого вы вводите DTO, которые будут возвращаться в ответах и ​​/ или получаться как тело сообщения.В этом случае у вас есть весь контроль - вы не подвергаете слишком много структуры данных.Чтобы это произошло, вы должны сначала создать DTO, а затем записать отображение между DTO и объектом базы данных - , это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...