首页 文章

清理代码以在Spring @PatchMapping中对域类进行部分修补?

提问于
浏览
3

在Spring中,我编写这样的代码来处理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);
}

显然,这里至少有两个缺点:

  • 由于大量的空检查,代码不干净 .

  • 即使将null检查抽象为函数,当我们更改 Order 类的定义时仍然存在问题 . 也就是说,在 Order 类中删除字段或添加新字段时,也必须重写此代码块 .

我知道我可以在客户端做一些空检查,就像只发送非空字段来做一个PATCH,但我想知道是否有一种优雅的方法来做到这一点?像对象映射还是其他一些方法?

3 回答

  • 0

    您可以使用可选字段定义新的参数类型,如OrderPatch . (Spring为您执行可选映射) . 在patchOrder()方法体中,您可以使用Optional.orElse(),将现有顺序的值作为默认值,而不使用if语句 .

  • 0

    首先,而不是像下面那样只检查null:

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

    你可以把它变成一行:

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

    还使用spring提供的方法检查null和Empty值 .

    对于点 "b" ,您可以使用以下代码:

    BeanUtils.copyProperties(bean2, bean1);
    

    在pom.xml中添加以下依赖项

    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.9.3</version>
    </dependency>
    
  • 1

    在setter中传输nullchecker:

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

    在 class 里面

    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

    并在@RequestBody @Validated Order订单中向订单添加@Valid . 然后设置@NotNull,@ NotBlank

相关问题