验证字段何时相互依赖
Validate when fields depend on one another
我正在将请求对象名称 Person
传递给控制器。假设该对象有 2 个两个字段。以下业务规则适用:
- 如果字段
age
的值小于 18,则字段 sin
应留空;
- 如果不是,它将产生异常消息
the sin should be blank with age < 18
或者另一种方法是将字段 sin
设置为空字符串 (""
).
当这些输入相互依赖时,我验证这些输入的最佳方式是什么。我处理它们的方法是在控制器方法中验证它们。所以它应该看起来像那样
@GetMapping("/..."
public ResponseEntity<PersonResponse> getPersonResult(GetPersonRequest request)
{
if (request.getAge() < 18)
{
if (request.getSin.length > 0)
request.setSin("")
}
PersonResponse response = callThirdPartyAPIToRetrieveInformationAboutThatPerson(request)
return response ;
}
有没有更优雅的编码方式?控制器方法可以包含任何类似的验证逻辑吗?我是否违反了 SOLID 设计中的单一职责?
当然可以!这是一个很好的方法:classes 的单一职责 - 控制器负责处理数据,验证器 - 用于验证数据;开闭原则——经过验证的数据不能被控制器的方法改变; Liskov 原则与基本的 OOP 原则相关——验证器是独立的实体,无需任何额外操作即可更改为另一个;接口隔离很清楚,没有任何描述(完全分离classes);依赖倒置也是可以理解的——使用注解接口,控制器对其实现一无所知。所以,从意识形态和语言语法上来说,这是一个非常好的方法。
实施。
- 创造class级
@interface
。所有字段均可访问。
- 使用验证逻辑创建
ConstraintValidator
class。
- 在控制器方法中为
@RequestBody
设置此注释。
- 为控制器添加验证功能:
@Validated
用于控制器 class 和 @Valid
用于控制器方法中的 @RequestBody
实体。
如果需要处理验证异常,直接抛出一个新的异常在@ControllerAdvise
class中处理即可,验证或控制器中没有处理代码classes.
中创建 class 级验证器的示例
我正在将请求对象名称 Person
传递给控制器。假设该对象有 2 个两个字段。以下业务规则适用:
- 如果字段
age
的值小于 18,则字段sin
应留空; - 如果不是,它将产生异常消息
the sin should be blank with age < 18
或者另一种方法是将字段sin
设置为空字符串 (""
).
当这些输入相互依赖时,我验证这些输入的最佳方式是什么。我处理它们的方法是在控制器方法中验证它们。所以它应该看起来像那样
@GetMapping("/..."
public ResponseEntity<PersonResponse> getPersonResult(GetPersonRequest request)
{
if (request.getAge() < 18)
{
if (request.getSin.length > 0)
request.setSin("")
}
PersonResponse response = callThirdPartyAPIToRetrieveInformationAboutThatPerson(request)
return response ;
}
有没有更优雅的编码方式?控制器方法可以包含任何类似的验证逻辑吗?我是否违反了 SOLID 设计中的单一职责?
当然可以!这是一个很好的方法:classes 的单一职责 - 控制器负责处理数据,验证器 - 用于验证数据;开闭原则——经过验证的数据不能被控制器的方法改变; Liskov 原则与基本的 OOP 原则相关——验证器是独立的实体,无需任何额外操作即可更改为另一个;接口隔离很清楚,没有任何描述(完全分离classes);依赖倒置也是可以理解的——使用注解接口,控制器对其实现一无所知。所以,从意识形态和语言语法上来说,这是一个非常好的方法。
实施。
- 创造class级
@interface
。所有字段均可访问。 - 使用验证逻辑创建
ConstraintValidator
class。 - 在控制器方法中为
@RequestBody
设置此注释。 - 为控制器添加验证功能:
@Validated
用于控制器 class 和@Valid
用于控制器方法中的@RequestBody
实体。
如果需要处理验证异常,直接抛出一个新的异常在@ControllerAdvise
class中处理即可,验证或控制器中没有处理代码classes.