REST Spring 引导验证导致代码重复

REST Spring boot validation causing code duplication

我已经定义了两个 Spring 引导 REST 资源

POST /customer  

以上资源用于添加具有以下 JSON 的客户作为请求

{ 
 "customerFirstName" : "John"
 "customerLastName" : "Doe"
 "customerAddress" : {
    "addressLine1" : "22 XYZ Drive"
    "addressLine1" : "22 suite"
    "state" : "PY"
    "country" : "Ind"
    "zipCode" : "1235312"
  } 
}

现在我需要实现更新客户信息,所以定义了以下资源。要求是可以更新与客户相关的任何信息。因此,更新时的 Input JSON 与添加请求时相同。唯一需要注意的是,未提供的信息将不会更新。只有提供的信息才会更新。

PUT /customer/{customerId}

问题 : 我想使用 Spring 引导 Bean 请求验证。但是,添加和更新资源的验证要求不同,因此无法使用相同的 Customer 领域模型。但是,两种情况下的域模型完全相同,因此这会导致代码重复。我怎样才能避免这种情况,或者将验证移到外面并编写代码是否正确。

示例:在添加客户的情况下,必须提供客户地址,因此可以使用像@NotNull这样的注释。但是,在更新客户的情况下,客户地址不是强制性的。

您应该能够使用验证组并保留单个模型 class。每个约束都有 groups 属性,您可以使用它来定义验证方案。您可以有一个 Create 组,您将仅在 POST 请求中使用并在 PATCH 请求中忽略:

interface Create {}

class Customer {
    @NotNull(groups = Create.class)
    private String firstName;
    @NotNull(groups = Create.class)
    private String lastName;
    
    //....
}

然后,当您使用 Spring 时,您需要查看 @Validated 注释。这允许您定义要验证的特定组:

@PostMapping("/customer")
public ResponseEntity<Customer> create(@RequestBody @Validated(Create.class) Customer customer) {
    // do your thing
}  

您还可以查看 documentation 的这一部分,以了解有关组及其功能的更多信息