首页 > 解决方案 > 验证字段何时相互依赖

问题描述

我将请求对象名称传递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 设计中的单一责任?

标签: springvalidationspring-mvcdesign-patternsspring-annotations

解决方案


是的当然!这是一个很好的方法:类的单一职责 - 控制器负责处理数据,验证器 - 用于验证数据;开闭原则——经过验证的数据是不能通过控制器的方法改变的;Liskov 原则与基本 OOP 原则相关 - 验证器是独立的实体,无需任何额外操作即可更改为另一个;接口隔离清晰,没有任何描述(完全分离的类);依赖倒置也是可以理解的——使用注解接口,控制器对其实现一无所知。所以,从意识形态和语言语法来看,这是一个非常好的方法。

执行。

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

如果您需要处理验证异常,只需抛出一个新异常并在@ControllerAdvise类中处理,无需在验证或控制器类中处理代码。

官方资源中创建类级验证器的示例。


推荐阅读