我正在将请求对象名称Person
传递给控制器。可以说该对象有2个两个字段。适用以下业务规则:
age
的值<18,则字段sin
应留空;the sin should be blank with age < 18
中产生异常,或者另一种方式是将字段sin
设置为空字符串(""
)。当它们相互依赖时,验证这些输入的最佳方法是什么?我处理它们的方法是在controller方法中验证它们。所以应该看起来像这样
@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设计中的“单一职责”吗?
是的,当然!这是一个好方法:类的单一责任-控制器负责处理数据,验证器-验证数据;开闭原理-验证数据无法通过控制器的方法更改; Liskov原则与基本的OOP原则相关联-验证器是独立的实体,无需任何其他操作即可更改为另一个;接口隔离很清晰,没有任何描述(完全分离的类); Depency Inversion也可以理解-使用注释接口,控制器对它的实现一无所知。因此,从意识形态和语言语法上来说,这是一个非常好的方法。
实施。
@interface
。所有字段均可访问。ConstraintValidator
类。@RequestBody
设置此注释。@Validated
,对@Valid
实体使用@RequestBody
。如果需要处理验证异常,只需抛出一个新异常并在@ControllerAdvise
类中进行处理,而在验证类或控制器类中则无需处理代码。
the official resource中的创建类级别验证器的示例。