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 的这一部分,以了解有关组及其功能的更多信息
我已经定义了两个 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 的这一部分,以了解有关组及其功能的更多信息