验证字段何时相互依赖

Validate when fields depend on one another

我正在将请求对象名称 Person 传递给控制器​​。假设该对象有 2 个两个字段。以下业务规则适用:

当这些输入相互依赖时,我验证这些输入的最佳方式是什么。我处理它们的方法是在控制器方法中验证它们。所以它应该看起来像那样

@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);依赖倒置也是可以理解的——使用注解接口,控制器对其实现一无所知。所以,从意识形态和语言语法上来说,这是一个非常好的方法。

实施。

  1. 创造class级@interface。所有字段均可访问。
  2. 使用验证逻辑创建 ConstraintValidator class。
  3. 在控制器方法中为 @RequestBody 设置此注释。
  4. 为控制器添加验证功能:@Validated 用于控制器 class 和 @Valid 用于控制器方法中的 @RequestBody 实体。

如果需要处理验证异常,直接抛出一个新的异常在@ControllerAdviseclass中处理即可,验证或控制器中没有处理代码classes.

the official resource.

中创建 class 级验证器的示例