Как я могу управлять своей конечной точкой API для объекта, у которого есть другие связанные объекты? - PullRequest
0 голосов
/ 24 апреля 2020

Я создаю RESTful API с помощью Spring. Я читаю документы и учебные пособия, и большинство из них содержат только базовые c объекты в своих примерах, и я не знаю, как объединить все это для решения моей текущей проблемы ...

Я не знаю знаете, как обрабатывать 2 вещи здесь:

  1. Каков наилучший способ обработать создание моей сущности с помощью HTTP-запроса? Должен ли я отправлять идентификаторы связанных сущностей в теле, в параметрах запроса? Должен ли я просто отправить весь объект?
  2. В этом случае, если я отправлю идентификаторы связанных объектов по отдельности, я считаю, что аннотация @Valid сработает как недействительная, потому что тело не будет иметь объекты модели запрашивает (Employee и Customer, в моем случае).

Это конечная точка:

    @PostMapping("/orders")
    ResponseEntity<EntityModel<Order>> createOrder(@Valid @RequestBody Order order) {
        order.setStatus(Status.IN_PROGRESS);
        Order newOrder = repository.save(order);

        return ResponseEntity
            .created(linkTo(methodOn(OrderController.class).getOrder(newOrder.getId())).toUri())
            .body(assembler.toModel(newOrder));
    }

Сущность, которую я хочу создать и проверить:

@Data
@Entity
@Table(name = "Orders")
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @NotBlank
    @NotNull
    private String description;

    @NotBlank
    @NotNull
    private Status status;

    @NotNull
    @ManyToOne
    @JoinColumn(foreignKey = @ForeignKey(name = "employee_id_fk"))
    private Employee employee;

    @NotNull
    @ManyToOne
    @JoinColumn(foreignKey = @ForeignKey(name = "customer_id_fk"))
    private Customer customer;

    protected Order() {}

    public Order(String description) {
        this.description = description;
        this.status = Status.IN_PROGRESS;
    }
}

Заранее большое спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Как лучше всего обрабатывать создание моей сущности с помощью HTTP-запроса? Должен ли я отправлять идентификаторы в теле, в параметрах запроса? Должен ли я просто отправить весь объект?

Когда мы создаем новую запись в базе данных, мы не отправляем Id в запросе, Id будет сгенерирован автоматически на основе стратегии определено в @GeneratedValue при сохранении объекта с помощью orderRepository.save(order); Вам просто нужно передать объект с требуемыми деталями, которые вы хотите сохранить.

Идеальный способ получить полезную нагрузку для @RequesetBody с помощью DTO . Мы можем создавать DTO в соответствии с требованиями и можем указывать идентификаторы типа Long или необходимые вместо использования всего объекта, такого как Customer и Employee

public class OrderDTO {

    private Long id;

    @NotBlank
    @NotNull
    private String description;

    @NotBlank
    @NotNull
    private Status status;

    @NotNull
    private Employee employeeId;

    @NotNull
    private Long customerId;

    protected Order() {}

    public Order(...) {
       ...
    }
}

Полезная нагрузка запроса будет:

{
    "id" : null,
    "description" : "payload using DTO",
    "status" : "yourStatus",
    "employeeId" : 1,
    "customerId" : 2
}

В этом случае, если я отправлю идентификаторы отдельно, я считаю, что аннотация @Valid сработает как недействительная, поскольку в теле не будет объектов, которые запрашивает модель (Employee и Customer, в моем case)

@Valid проверил ограничения, которые мы указали для модального / DTO, используемого в @RequestBody

0 голосов
/ 24 апреля 2020

по моему мнению, лучше не использовать вашу модель сущности непосредственно в вашей конечной точке. Лучше использовать DTO в вашей конечной точке.

иногда вы хотите увеличить или уменьшить количество ваших http-параметров или хотите создать несколько сложных методов проверки для входных параметров.

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