在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 回答
您可以使用可选字段定义新的参数类型,如OrderPatch . (Spring为您执行可选映射) . 在patchOrder()方法体中,您可以使用Optional.orElse(),将现有顺序的值作为默认值,而不使用if语句 .
首先,而不是像下面那样只检查null:
你可以把它变成一行:
还使用spring提供的方法检查null和Empty值 .
对于点 "b" ,您可以使用以下代码:
在pom.xml中添加以下依赖项
在setter中传输nullchecker:
在 class 里面
然后添加到设置者NullCheck ...
===========================================或者你可以参考:https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/validation.html
并在@RequestBody @Validated Order订单中向订单添加@Valid . 然后设置@NotNull,@ NotBlank