SpringBoot + Validation数据校验

SpringBoot + Validation数据校验

  • 校验注解
  • 数据校验示例
  • 自定义校验错误信息
  • 分组校验

校验注解

  • @Null 被注解的元素必须为 null
  • @NotNull 被注解的元素必须不为 null
  • @AssertTrue 被注解的元素必须为 true
  • @AssertFalse 被注解的元素必须为 false
  • @Min(value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值
  • @Max(value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值
  • @DecimalMin(value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值
  • @DecimalMax(value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值
  • @Size(max=, min=) 被注解的元素的大小必须在指定的范围内
  • @Digits (integer, fraction) 被注解的元素必须是一个数字,其值必须在可接受的范围内
  • @Past 被注解的元素必须是一个过去的日期
  • @Future 被注解的元素必须是一个将来的日期
  • @Pattern(regex=,flag=) 被注解的元素必须符合指定的正则表达式
  • @NotBlank(message =) 验证字符串非 null,且长度必须大于0
  • @Email 被注解的元素必须是电子邮箱地址
  • @Length(min=,max=) 被注解的字符串的大小必须在指定的范围内
  • @NotEmpty 被注解的字符串的必须非空
  • @Range(min=,max=,message=) 被注解的元素必须在合适的范围内

数据校验示例

1. 添加Validation依赖

>
    >org.springframework.boot>
    >spring-boot-starter-validation>
>

2. User类,添加校验注解

@Getter
@Setter
@ToString
public class User {

    private Long id;
    @Size(min = 5, max = 12)
    private String name;
    @DecimalMin(value = "1")
    @DecimalMax(value = "100")
    private Integer age;
    @NotBlank
    private Integer sex;
    @NotBlank
    private String address;
    @NotBlank
    @Email
    private String email;
}

3. UserController业务处理类

接口需要添加 @Validated 注解

@RestController
public class UserController {

    @PostMapping("user")
    public void addUser(@Validated @RequestBody User user, BindingResult result) {

        // BindingResult 校验错误信息结果
        if (result != null && result.hasErrors()){
            List<ObjectError> allErrors = result.getAllErrors();
            for (ObjectError error : allErrors) {
                System.out.println(error.getObjectName() + " " + error.getDefaultMessage());
            }
        }else {
            System.out.println("用户信息校验成功");
        }

    }
}

4. 不合法数据测试

POST:localhost:8081/user
{
	"name":"123",
	"age":123,
	"sex":1,
	"email":"123"
}

打印结果:

user 不能为空
user 个数必须在512之间
user 不是一个合法的电子邮件地址
user 必须小于或等于100

自定义校验错误信息

1. 在resources下创建ValidationMessages.properties配置文件

user.name=用户名长度必须在5~12之间
user.age.min=年龄必须大于等于1
user.age.max=年龄必须小于等于100
user.sex=性别不能为空
user.address=地址不能为空
user.email.notblank=邮箱不能为空
user.email.pattern=邮箱格式不正确

2. 校验注解上,指定返回信息

@Getter
@Setter
@ToString
public class User {

    private Long id;
    @Size(min = 5, max = 12, message = "{user.name}")
    private String name;
    @DecimalMin(value = "1", message = "{user.age.min}")
    @DecimalMax(value = "100", message = "{user.age.max}")
    private Integer age;
    @NotNull(message = "{user.sex}")
    private Integer sex;
    @NotBlank(message = "{user.address}")
    private String address;
    @NotBlank(message = "{user.email.notblank}")
    @Email(message = "{user.email.pattern}")
    private String email;
}

再次访问接口,打印结果:

user 地址不能为空
user 用户名长度必须5~12字符
user 年龄必须小于等于100
user 邮箱格式不正确

分组校验

由于校验规则都是定义在实体类上面的,但是,在不同的数据提交环境下,校验规则可能不一样。例如,用户的 id 是自增长的,添加的时候,可以不用传递用户 id,但是修改的时候则必须传递用户 id,这种情况下,就需要使用分组校验。

1.分组校验,首先需要定义校验组,所谓的校验组,其实就是空接口:

public interface ValidationGroup1 {
}
public interface ValidationGroup2 {
}

2.然后,在实体类中,指定校验规则所属的组 groups,一个规则可以属于一个组,也可以属于多个组。不指定则不校验:

@Getter
@Setter
@ToString
public class User {

    private Long id;
    @Size(min = 5, max = 12, message = "{user.name}", groups = {ValidationGroup1.class})
    private String name;
    @DecimalMin(value = "1", message = "{user.age.min}")
    @DecimalMax(value = "100", message = "{user.age.max}", groups = {ValidationGroup1.class,ValidationGroup2.class})
    private Integer age;
    @NotNull(message = "{user.sex}")
    private Integer sex;
    @NotBlank(message = "{user.address}")
    private String address;
    @NotBlank(message = "{user.email.notblank}")
    @Email(message = "{user.email.pattern}", groups = {ValidationGroup2.class})
    private String email;
}

3.最后,在接收参数的地方,指定校验组 @Validated(value = {})

@RestController
public class UserController {

    @PostMapping("user")
    public void addUser(@Validated(value = {ValidationGroup1.class}) @RequestBody User user, BindingResult result) {

        // BindingResult 校验错误信息结果
        if (result != null && result.hasErrors()){
            List<ObjectError> allErrors = result.getAllErrors();
            for (ObjectError error : allErrors) {
                System.out.println(error.getObjectName() + " " + error.getDefaultMessage());
            }
        }else {
            System.out.println("用户信息校验成功");
        }

    }
}

4.不合法数据测试。分组1只校验了名字和最大年龄,其他字段不会被校验

POST:localhost:8081/user
{
	"name":"123",
	"age":123,
	"sex":1,
	"email":"123"
}

打印结果:

user 年龄必须小于等于100
user 用户名长度必须在5~12之间

参考文章:http://itboyhub.com/2021/01/28/springmvc-exception-validation/

你可能感兴趣的:(SpringBoot,spring,boot,java,数据校验)