在 Spring MVC 中使用 Validation API 进行字段校验

为什么使用 Validation 来验证参数

  
通常我们在使用 spring 框架编写接口时,对于部分接口的参数我们要进行判空或者格式校验来避免程序出现异常。那是我们一般都是使用 if-else 逐个对参数进行校验。这种方法按逻辑来说也是没有问题的,同样也能实现预期效果。但是,这样的代码从可读性以及美观程序来看,是非常糟糕的。那么,我们就可以使用 @valid 注解来帮助我们优雅的校验参数。

如何使用 Validation 相关注解进行参数校验

  • 1、添加 pom 依赖
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  • 2、为实体类中的参数或者对象添加相应的注解;
@Data
public class Taco {
    @NotNull // 不能为空
    @Size(min = 5, message = "Name must be at least 5 characters long") // 设置最小长度为 5
    private String name;
    @Size(min = 1, message = "You must choose at least 1 ingredient") // 设置最小长度为 1
    private List<String> ingredients;

}
  • 3、在控制器层进行注解声明,或者手动调用校验方法进行校验;
    @PostMapping
    public String processDesign(@Valid Taco design, Errors errors){
        if (errors.hasErrors()){
            return "design";
        }

        log.info("Processing design:"+ design);
        return "redirect:/orders/current";
    }
  • 4、修改表单视图以展现校验错误;

常用的 Validation API 注解

  • @AssertFalse Boolean,boolean 验证注解的元素值是false

  • @AssertTrue Boolean,boolean 验证注解的元素值是true

  • @NotNull 任意类型 验证注解的元素值不是null

  • @Null 任意类型 验证注解的元素值是null

  • @Min(value=值) BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存储的是数字)子类型 验证注解的元素值大于等于@Min指定的value值

  • @Max(value=值) 和@Min要求一样 验证注解的元素值小于等于@Max指定的value值

  • @Digits(integer=整数位数, fraction=小数位数) 和@Min要求一样 验证注解的元素值的整数位数和小数位数上限

  • @Size(min=下限, max=上限) 字符串、Collection、Map、数组等 验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小

  • @Past java.util.Date,java.util.Calendar;Joda Time类库的日期类型 验证注解的元素值(日期类型)比当前时间早

  • @Future 与@Past要求一样 验证注解的元素值(日期类型)比当前时间晚

  • @NotBlank CharSequence子类型 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格

  • @Length(min=下限, max=上限) CharSequence子类型 验证注解的元素值长度在min和max区间内

  • @NotEmpty CharSequence子类型、Collection、Map、数组 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

  • @Range(min=最小值, max=最大值) BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型 验证注解的元素值在最小值和最大值之间

  • @Email(regexp=正则表达式,flag=标志的模式) CharSequence子类型(如String) 验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式

  • @Pattern(regexp=正则表达式,flag=标志的模式) String,任何CharSequence的子类型 验证注解的元素值与指定的正则表达式匹配

  • @CreditCardNumber 注解。这个注解声明该属性的值必须是合法的信用卡号,它要能通过 Luhn 算法的检查。

所有的校验注解都包含了一个message属性,该属性定义了当输入的信息不满足声明的校验规则时要给用户展现的消息。

@Valid 注解,在表单绑定时进行校验

示例:

    @PostMapping
    public String processDesign(@Valid Taco design, Errors errors){
        if (errors.hasErrors()){
            return "design";
        }

        log.info("Processing design:"+ design);
        return "redirect:/orders/current";
    }

@Valid 注解会告诉 Spring MVC 要对提交的 Taco 对象进行校验,而校验时机是在它绑定完表单数据之后、调用 processDesign() 之前。如果存在校验错误,那么这些错误的细节将会捕获到一个 Errors 对象中并传递给 processDesign()。

processDesign() 方法的前几行会查阅 Errors 对象,调用其 hasErrors() 方法判断是否有校验错误。如果存在校验错误,那么这个方法将不会处理 Taco 对象并返回 “design” 视图名,表单会重新展现。

参考资料

1、springboot使用Validation API和全局异常优雅的校验方法参数
2、Springboot集成validation校验API参数的合法性

每天学习一点点,每天进步一点点。

posted @ 2020-10-03 14:43  爱吃西瓜的番茄酱  阅读(595)  评论(0编辑  收藏  举报