返回

一文读懂Java参数校验之@Valid与@Validated的奥秘

后端

参数校验:使用 @Valid 和 @Validated 注解提升 Java 代码质量

复杂数据模型带来的挑战

在开发 Java 应用程序时,处理复杂数据模型时经常遇到一个常见的痛点:参数校验。逐层校验每个参数会产生冗长的代码,难以维护,降低开发效率。

@Valid 和 @Validated 注解的登场

Java 中引入了 @Valid 和 @Validated 注解,为参数校验提供了简洁、高效的解决方案。这些注解可以自动根据参数类型执行校验,大大简化代码并提高可读性。

深入理解 @Valid 和 @Validated

1. @Valid:参数校验的得力助手

@Valid 注解是参数校验的可靠助手。只需在参数前面添加 @Valid,框架就会根据参数类型进行自动校验,如检查字符串是否为空、不超过最大长度等。

2. @Validated:分组校验,条理分明

@Validated 注解支持分组校验,可将参数划分为不同的校验组。通过指定不同的校验组,针对不同需求执行不同的校验操作,让代码组织更清晰。

3. 嵌套校验,层层递进

@Valid 和 @Validated 注解的另一个强大功能是嵌套校验。嵌套校验允许在一个参数中嵌套其他参数,并对嵌套参数进行校验。这对于处理复杂数据结构非常有用。

实战演练:代码示例

public class User {

    @Valid
    private String username;

    @Valid
    @Validated(groups = {BasicInfoGroup.class})
    private Address address;
}

public class Address {

    @NotBlank
    private String street;

    @NotBlank
    private String city;
}

public class UserController {

    @PostMapping("/user")
    public void createUser(@RequestBody @Valid User user) {
        // 参数校验通过后,即可进行业务操作
        // ...
    }
}

@Valid 和 @Validated 注解的优势

使用 @Valid 和 @Validated 注解带来诸多好处:

  • 代码简化: 注解方式校验参数,避免冗长的 if...else... 操作。
  • 代码可读性增强: 代码简洁明了,易于理解和维护。
  • 代码可重用性提升: 校验逻辑可复用,提高代码可重用性。
  • 代码出错率降低: 框架自动校验参数,降低代码出错风险。

常见问题解答

1. 什么时候使用 @Valid 和 @Validated 注解?

在需要对参数进行校验时,使用 @Valid 注解。当需要对参数进行分组校验或嵌套校验时,使用 @Validated 注解。

2. @Valid 和 @Validated 注解的区别是什么?

@Valid 注解用于一般参数校验,而 @Validated 注解用于分组校验和嵌套校验。

3. 如何指定校验规则?

使用 javax.validation 包中的注解指定校验规则,如 @NotBlank、@Email 等。

4. 如何自定义校验器?

可以通过实现 javax.validation.ConstraintValidator 接口来创建自定义校验器。

5. 如何在 Spring Boot 中使用 @Valid 和 @Validated 注解?

在 Spring Boot 中,使用 @EnableValidation 注解启用参数校验,并将 @Valid 和 @Validated 注解添加到要校验的参数上。

总结

@Valid 和 @Validated 注解是 Java 中强大的参数校验工具。它们可以简化代码、增强可读性、提高可重用性并降低出错率。通过利用这些注解,可以显著提升 Java 代码的质量。