Чистый код, чтобы сделать частичное исправление класса домена в Spring @PatchMapping? - PullRequest
0 голосов
/ 10 декабря 2018

Весной я пишу такой код для обработки запроса PATCH:

@PatchMapping(path="/{orderId}", consumes="application/json")
public Order patchOrder(@PathVariable("orderId") Long orderId, @RequestBody Order patch) {
    Order order = repo.findById(orderId).get();
    if (patch.getDeliveryName() != null) {
        order.setDeliveryName(patch.getDeliveryName());
    }
    if (patch.getDeliveryStreet() != null) {
        order.setDeliveryStreet(patch.getDeliveryStreet());
    }
    if (patch.getDeliveryCity() != null) {
        order.setDeliveryCity(patch.getDeliveryCity());
    }
    //...
    //Check all fields in Order class.
    return repo.save(order);
}

Очевидно, здесь есть как минимум два недостатка:

  1. Код неочищается из-за большого количества нулевой проверки.
  2. Даже если абстрагировать нулевую проверку в функции, все еще возникают проблемы, когда мы меняем определение класса Order.То есть, при удалении полей или добавлении новых полей в Order классе, этот кусок кода также должен быть переписан.

Я знаю, что могу выполнить некоторую проверку нуля на стороне клиента, как толькоотправка ненулевых полей для выполнения PATCH, но мне интересно, есть ли элегантный способ сделать это?Как сопоставление объектов или какие-то другие способы?

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Перво-наперво вместо проверки только нулевого значения, как показано ниже:

if (patch.getDeliveryName() != null) {
    order.setDeliveryName(patch.getDeliveryName());
}

Вы можете сделать это одной строкой:

order.setDeliveryName(StringUtils.isEmpty(patch.getDeliveryName()) ? "" : patch.getDeliveryName());

Также с помощью пружинного метода проверяет нулевые и пустые значения.

А для точки "b" вы можете использовать следующий код:

BeanUtils.copyProperties(bean2, bean1);

добавить следующую зависимость в pom.xml

<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.3</version>
</dependency>
0 голосов
/ 10 декабря 2018

Передайте нуль-чекер в установщик:

  Order order = repo.findById(orderId).get();
  order.setByPatch(patch)

внутри класса Order

  public void setByPatch(Patch patch){
    this.setDeliveryName(patch.getDeliveryName());
    this.setDeliveryStreet(patch.getDeliveryStreet());
    this.setDeliveryCity(patch.getDeliveryCity());
  }

, затем добавьте к установщикам NullCheck ...

================================================= Или вы можете сослаться на: https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/validation.html

И добавьте @Valid к ордеру в ордере @RequestBody @Validated Order.И затем установите @NotNull, @ NotBlank

0 голосов
/ 10 декабря 2018

Вы можете определить новый тип параметра, например OrderPatch, с помощью необязательных полей.(Spring делает сопоставление необязательным для вас).В теле метода patchOrder () вы можете использовать Optional.orElse () со значением существующего порядка по умолчанию, без операторов if.

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