spring boot validation使用
  wOpKqXEVWVT6 2023年12月08日 11 0


spring-boot-starter-validation 是 Spring Boot 中用于支持数据验证的模块。它建立在 Java Validation API(JSR-380)之上,提供了一种方便的方式来验证应用程序中的数据。以下是使用 spring-boot-starter-validation 的基本方法:

快速入门

1.添加依赖:

在你的 Spring Boot 项目的 pom.xml 文件中,添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

如果你使用 Gradle,可以在 build.gradle 文件中添加:

implementation 'org.springframework.boot:spring-boot-starter-validation'
2.创建验证规则:

在需要进行数据验证的类中,使用 Java Validation API 中的注解标记字段,以定义验证规则。例如,使用 @NotBlank 来确保字段不为空:

public class MyRequest {
    @NotBlank
    private String name;

    /**
     *    1.@NotNull:不能为null,但可以为empty(""," ","   ")      
     *    2.@NotEmpty:不能为null,而且长度必须大于0 (" ","  ")
     *    3.@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0("test")    即:必须有实际字符
     * 复制代码
     */
    @NotBlank(message="用户名不能为空")
    private String userName;

    @NotBlank(message="年龄不能为空")
    @Pattern(regexp="^[0-9]{1,2}$",message="年龄不正确")
    private String age;

    @AssertFalse(message = "必须为false")
    private Boolean isFalse;
    /**
     * 如果是空,则不校验,如果不为空,则校验
     */
    @Pattern(regexp="^\\d{4}(-)(1[0-2]|0?\\d)\\1([0-2]\\d|\\d|30|31)$",message="出生日期格式不正确")
    private String birthday;

    @Pattern(regexp = "^[M|F|U|m|f|u]{1}$")
    private String gender;

    @Pattern(regexp = "^(MS)?(MR)?(PRO)?(MRS)?(DOC)?$")
    private String civility;

    @Size(min = 1, message = "field names can't be empty")
    private List<String> names = new ArrayList();
    // Other fields and methods...
}

这只是一个简单的例子,Java Validation API 提供了许多其他注解,如 @NotNull@Min@Max@Email 等,以满足各种验证需求。

3.在控制器中使用验证:

在需要验证输入数据的地方,通常是在 Spring MVC 的控制器中,使用 @Valid 注解来启用验证:

@RestController
public class MyController {
    @PostMapping("/submit")
    public ResponseEntity<String> submit(@Valid @RequestBody MyRequest request) {
        // Process the validated request
        return ResponseEntity.ok("Request is valid");
    }
}

在上面的例子中,@Valid 注解用于告诉 Spring Boot 对 MyRequest 对象进行验证。如果验证失败,将会抛出 MethodArgumentNotValidException 异常。

4.处理验证错误:

若要处理验证错误,可以使用 BindingResult 对象。修改控制器方法以接受 BindingResult 参数,并检查是否有错误:

@RestController
public class MyController {
    @PostMapping("/submit")
    public ResponseEntity<String> submit(@Valid @RequestBody MyRequest request, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            // Handle validation errors
            return ResponseEntity.badRequest().body("Validation errors");
        }

        // Process the validated request
        return ResponseEntity.ok("Request is valid");
    }
}

这就是使用 spring-boot-starter-validation 的基本步骤。通过这种方式,你可以方便地在 Spring Boot 应用程序中进行数据验证,确保输入数据的合法性。

分组校验

在使用 Spring Boot Validation 进行分组校验时,你可以使用 Validation API 提供的 @GroupSequence 注解来定义校验顺序。下面是一个简单的示例,演示如何在 Spring Boot 中实现分组校验。

首先,假设你有一个包含分组信息的 Java Bean 类:

import javax.validation.GroupSequence;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

public class MyRequest {

    // 定义分组
    public interface FirstGroup {}

    public interface SecondGroup {}

    // 定义分组顺序
    @GroupSequence({FirstGroup.class, SecondGroup.class})
    public interface AllGroups {}

    // 分组校验示例
    @NotNull(message = "ID不能为空", groups = FirstGroup.class)
    private Long id;

    @NotBlank(message = "姓名不能为空", groups = SecondGroup.class)
    private String name;

    @NotNull(groups = {FirstGroup.class, SecondGroup.class}, message = "密码不能为空")
    private String password;

    // 省略其他字段和方法
}

在上述示例中,我们定义了两个分组 FirstGroupSecondGroup,然后使用 @GroupSequence 注解定义了它们的顺序。接着,在字段上使用 @NotNull@NotBlank 注解,并通过 groups 属性指定了校验时所属的分组。

接下来,在你的控制器或服务中,使用 @Validated 注解来指定使用哪个分组进行校验:

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Validated
public class MyController {

    @PostMapping("/submit")
    public String submit(@Validated(MyRequest.FirstGroup.class) @RequestBody MyRequest request) {
        // 处理请求
        return "Request is valid";
    }

    @PostMapping("/update")
    public String update(@Validated(MyRequest.SecondGroup.class) @RequestBody MyRequest request) {
        // 处理请求
        return "Request is valid";
    }
}

在上述示例中,@Validated 注解用于标记控制器,然后在方法参数上使用 @Validated 注解来指定使用哪个分组进行校验。在 /submit 接口中使用了 FirstGroup 进行校验,而在 /update 接口中使用了 SecondGroup 进行校验。

这样,你就可以实现基于分组的校验。请注意,分组的顺序是在 @GroupSequence 注解中定义的。

@Validated与@Valid 的区别
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,这个网上也有资料,不详述。
@Valid:作为标准JSR-303规范,还没有吸收分组的功能。

常用注解说明

在 Spring Boot 中,用于数据验证的常用注解是来自 Java Validation API(JSR-380)的注解。以下是一些常用的注解:

  1. 通用注解
  • @NotNull: 验证注解的元素值不是 null。
  • @Null: 验证注解的元素值是 null。
  • @AssertTrue: 验证注解的元素值是 true
  • @AssertFalse: 验证注解的元素值是 false
  • @Min(value): 验证注解的元素值大于等于指定的值。
  • @Max(value): 验证注解的元素值小于等于指定的值。
  • @Size(max, min): 验证注解的元素值的大小在指定的范围内。
  • @Digits(integer, fraction): 验证注解的元素值的整数部分和小数部分的数字不超过指定的数值。
  1. 字符串验证
  • @NotBlank: 验证注解的元素值不为空(不为 null、去掉前后空格后长度大于0)。
  • @NotEmpty: 验证注解的元素值不为 null 且不为空。
  • @Email: 验证注解的元素值是一个有效的电子邮件地址。
  1. 数值验证
  • @Positive: 验证注解的元素值是正数。
  • @PositiveOrZero: 验证注解的元素值是非负数。
  • @Negative: 验证注解的元素值是负数。
  • @NegativeOrZero: 验证注解的元素值是非正数。
  1. 日期和时间验证
  • @Past: 验证注解的元素值是过去的日期或时间。
  • @PastOrPresent: 验证注解的元素值是过去或当前的日期或时间。
  • @Future: 验证注解的元素值是将来的日期或时间。
  • @FutureOrPresent: 验证注解的元素值是将来或当前的日期或时间。
  1. 自定义注解
  • 你还可以创建自定义的注解,通过实现 ConstraintValidator 接口来定义自己的验证逻辑,并使用 @Constraint 注解进行声明。

这些注解可以通过在 Java Bean 的字段上使用来进行数据验证。在 Spring Boot 中,通常与 @Valid@Validated 一起使用,以触发验证。在上述提到的示例中,已经展示了一些常用注解的使用方式。

示例:
以下是常用定义校验的注解及其使用示例:

  1. @NotNull:被注解的元素必须不为null。例如:
public class User {
    @NotNull(message = "姓名不能为空")
    private String name;
    // ...其他字段...
}
  1. @NotEmpty:被注释的对象必须不为空(数据:String,Collection,Map,arrays)。例如:
public class User {
    @NotEmpty(message = "角色列表不能为空")
    private List<Role> roles;
    // ...其他字段...
}
  1. @NotBlank:CharSequence子类型,验证注解的元素值不为空(包括不为null或去除首位空格后长度为0)。例如:
public class User {
    @NotBlank(message = "手机号码不能为空")
    private String phoneNumber;
    // ...其他字段...
}
  1. @Min:验证数字是否小于等于指定的最小值。例如:
public class User {
    @Min(value = 18, message = "年龄不能低于18岁")
    private int age;
    // ...其他字段...
}
  1. @Max:验证数字是否大于等于指定的最大值。例如:
public class User {
    @Max(value = 60, message = "年龄不能超过60岁")
    private int age;
    // ...其他字段...
}
  1. @Pattern:用于校验字符串是否符合指定的正则表达式。例如:
public class User {
    @Pattern(regexp = "^\\d{6}$", message = "身份证号码格式不正确")
    private String idCardNumber;
    // ...其他字段...
}
  1. @Size:用于限制字符序列(如String、Collection、Map等)的长度,支持min和max属性。例如:
public class User {
    @Size(min = 6, max = 18, message = "密码长度必须在6-18之间")
    private String password;
    // ...其他字段...
}
  1. @Email:用于校验邮箱地址。例如:
public class User {
    @Email(message = "请输入正确的邮箱地址")
    private String email;
    // ...其他字段...
}
  1. @Past:用于判断日期是否在过去。例如:
public class User {
    @Past(message = "生日不能晚于现在")
    private Date birthday;
    // ...其他字段...
}
  1. @Future:用于判断日期是否在未来。例如:
public class User {
    @Future(message = "截止日期必须在未来")
    private Date deadline;
    // ...其他字段...
}
  1. @DecimalMax:验证数字是否小于等于指定的最大值。例如:
public class User {
    @DecimalMax(value = "100.00", message = "金额不能超过100元")
    private double amount;
    // ...其他字段...
}
  1. @DecimalMin:验证数字是否大于等于指定的最小值。例如:
public class User {
    @DecimalMin(value = "1.00", message = "价格不能低于1元")
    private double price;
    // ...其他字段...
}

以上都是常见的数据校验注解,使用这些注解可以让我们的应用程序具有更强的健壮性,避免非法数据的输入。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月08日 0

暂无评论

推荐阅读
wOpKqXEVWVT6