Spring中参数校验@Validation注解的详细介绍

在Spring框架中,@Valid 注解是一个强大的工具,用于验证和校验用户输入的数据,确保数据的合法性和完整性。通过结合其他注解和验证器,@Valid 注解可以轻松地实现数据验证,从而提高应用程序的健壮性和安全性。本文将详细介绍 Spring 中的 @Valid 注解,以及如何在应用程序中正确使用它。

什么是 @Valid 注解?

@Valid 注解是 Spring 框架中的一个注解,用于在方法参数或方法返回值上标记数据校验的目标。它告诉 Spring 在处理方法调用时要进行数据验证。该注解通常与其他验证相关的注解结合使用,如 @NotNull@NotBlank@Min@Max 等,用于指定验证规则。

使用 @Valid 注解进行方法参数验证

在方法参数上使用 @Valid 注解,可以在方法调用之前对参数进行验证。这对于确保输入数据的有效性非常有用。

以下是一个示例,展示了如何在 Spring 控制器方法中使用 @Valid 注解进行参数验证:

java 复制代码
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @PostMapping("/register")
    public ResponseEntity<String> registerUser(@Valid @RequestBody UserDto userDto) {
        // 处理用户注册逻辑
        return ResponseEntity.ok("User registered successfully");
    }
}

在上面的示例中,@Valid 注解用于 userDto 参数上。Spring 将会在调用 registerUser 方法之前,对 userDto 参数的属性进行验证。

结合其他验证注解

通常情况下,@Valid 注解会与其他验证相关的注解结合使用,以定义验证规则。例如,你可以使用 @NotNull@NotBlank@Min@Max 等注解来对属性进行更具体的验证。

java 复制代码
public class UserDto {

    @NotNull
    @NotBlank
    private String username;

    @NotNull
    @Min(18)
    private Integer age;

    // ...其他属性和方法
}

在上面的示例中,username 属性使用了 @NotNull@NotBlank 注解,表示它不能为空且不能只包含空格。age 属性使用了 @NotNull@Min(18) 注解,表示它不能为空且必须大于等于 18。

在Spring框架中,你可以使用各种验证注解来定义不同类型的校验规则。这些注解位于javax.validation.constraints包下,用于对数据进行不同方面的验证。以下是一些常用的验证注解及其对应的校验规则:

  1. @NotNull 验证字段不能为null

  2. @NotBlank 验证字符串不能为空,且至少包含一个非空字符。

  3. @NotEmpty 验证字符串、集合或数组不能为空,不同于@NotBlank,它不要求至少包含一个非空字符。

  4. @Min(value) 验证数字必须大于等于指定的最小值。

  5. @Max(value) 验证数字必须小于等于指定的最大值。

  6. @Size(max, min) 验证字符串、集合或数组的大小必须在指定的范围内。

  7. @Email 验证字符串是否为合法的电子邮件地址。

  8. @Pattern(regexp) 验证字符串是否符合指定的正则表达式。

  9. @Digits(integer, fraction) 验证数字是否符合指定的位数要求,包括整数和小数部分。

  10. @Positive 验证数字必须为正数。

  11. @Negative 验证数字必须为负数。

  12. @Past 验证日期必须为过去的时间。

  13. @Future 验证日期必须为将来的时间。

  14. @AssertTrue 验证字段必须为true

  15. @AssertFalse 验证字段必须为false

  16. @CreditCardNumber 验证字符串是否为合法的信用卡号。

  17. @URL 验证字符串是否为合法的URL。

  18. @Valid 用于标记需要嵌套验证的对象。

这些只是一些常见的验证注解,实际上在Spring中还有更多的验证注解可供使用。你可以根据具体的业务需求,选择合适的验证注解来定义数据的校验规则。另外,你还可以通过自定义验证器来实现更复杂的校验逻辑,以满足特定的验证需求。

自定义验证器

除了使用预定义的验证注解,你还可以创建自定义的验证器来满足特定的验证需求。要创建一个自定义的验证器,需要实现 javax.validation.ConstraintValidator 接口。

以下是一个示例,展示了如何创建一个自定义的验证器:

java 复制代码
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class AgeConstraintValidator implements ConstraintValidator<AgeConstraint, Integer> {

    @Override
    public boolean isValid(Integer age, ConstraintValidatorContext context) {
        return age != null && age >= 18;
    }
}

然后,你可以在自定义的注解上使用这个验证器:

java 复制代码
import javax.validation.Constraint;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target({FIELD, METHOD, PARAMETER})
@Retention(RUNTIME)
@Constraint(validatedBy = AgeConstraintValidator.class)
public @interface AgeConstraint {
    String message() default "Invalid age";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

最后,将这个自定义的注解应用到需要验证的属性上:

java 复制代码
public class UserDto {

    @NotNull
    @NotBlank
    private String username;

    @AgeConstraint
    private Integer age;

    // ...其他属性和方法
}

总结

@Valid 注解是 Spring 框架中一个重要的工具,用于实现数据的验证和校验。结合其他验证注解和自定义验证器,它能

够轻松地验证用户输入的数据,从而提高应用程序的稳定性和安全性。通过在方法参数或方法返回值上添加 @Valid 注解,你可以确保数据的有效性,并在数据不合法时产生相应的错误信息,从而提供更好的用户体验和数据完整性。

相关推荐
weixin_BYSJ19878 分钟前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
Flynt29 分钟前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet30 分钟前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
星云API技术支持1 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin1 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
海宇AI2 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化
Bs_MoneyMagnet3 小时前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
cfm_29144 小时前
单例模式详解
java
我叫张土豆4 小时前
本体论、DDD、SDD、TDD:AI 编程时代的四层认知栈
java·人工智能
白远山4 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析