zoukankan      html  css  js  c++  java
  • Spring Boot 验证表单

    在实际工作中,得到数据后的第一步就是验证数据的正确性,如果存在录入上的问题,一般会通过注解校验,发现错误后返回给用户,但是对于逻辑上的错误,很难使用注解方式进行验证了,这个使用可以使用Spring所提供的验证器规则去验证。

    使用 JSR 303 注解验证输入内容

    Spring Boot 支持 JSR-303、Bean 验证框架,默认实现使用的是 Hibernate validator。在 Spring MVC 中,只需要使用 @Valid 注解在方法参数上,Spring Boot 即可对参数对象进行校验,校验结果放在 BindingResult 对象中。

    JSR-303
    jsr-303 是 Java 标准的验证框架,已有的实现有 Hibernate validator。JSR-303 定义了一些列注解来验证Bean 的属性,常用的有如下几种。

    空检查
    1、 @Null,验证对象是否为空
    2、 @NotNull,验证对象不为空
    3、 @NotBlank,验证字符串不为空或者不是空字符串
    4、 @NotEmpty, 验证对象不为 null,或者集合不为空

    长度检查
    1、 @Siz(min= , max=), 验证对象长度,可支持字符串、集合;
    2、 @Length, 字符串大小
    数值检测
    1、 @Min,验证数字是否大于指定值
    2、 @Max, 验证数字是否小于等于指定的值
    3、 @Digits, 验证数字是否符合指定格式,如 @Digits(integer=9,faraction=2)
    4、 @Range, 验证数字是否在指定范围内,如 @Range(min=1,max=100)
    其他
    1、 @Email, 验证是否为邮件格式,为 null 则不做校验
    2、 @Pattern, 验证String对象是否符合正则表达式的规则
    3、 @Past ,被注释的元素必须是一个过去的日期
    4、 @Future, 被注释的元素必须是一个将来的日期
    5、 @DateTimeFormat(paattern="yyyy-MM-dd") 日期转换

    public class WorkInfoForm {
    @NotNull
    Long id;
    @Size (min=3,max=20)
    String name;
    @Email
    String email;
    }
    
    

    通常不同的业务逻辑会有不同的验证逻辑,比如对于 WorkInfoForm来说,当更新的时候, id 必须不为null,但增加的时候, id必须是null。

    JSR-303 定义了group概念,每个校验注解都必须支持。校验注解作用在字段上的时候,可以指定一个或者多个group,当Spring Boot校验对象的时候,也可以指定校验的上下文属于那个group。这样,只有group匹配的时候,校验注解才能生效。上面的WorkInfoForm定义id字段校验可以更改为如下内容:

    public class WorkInfoForm {
    
    // 定义一个类,更新时校验组
    public interface Update{}
    //定义一个类,添加时校验组
    public interface Add{}
    
    @NotNull(groups={Update.class})
    @Null(groups={Add.class})
    Long id;
    @Size (min=3,max=20)
    String name;
    @Email
    String email;
    }
    

    这段代码表示,当校验上下文为 Add.class 的时候,@Null 生效,id需为空才能校验通过;当校验上下文为 Update.class 的时候,@NotNull 生效,id不能为空。

    MVC 中使用 @Validated
    Controller中,只需要给方法参数添加上@Validated即可触发一次校验。

    @ResponseBody
    @RequestMapping("/addworkinfo.html")
    public void addWorkInfo(@Validated({WorkInfoForm.Add.class}) WorkInfoForm workInfo, BindingResult result) {
    if(result.hasErrors()) {
    List<ObjectError> list = result.getAllErrors();
    FieldError error = (FieldError) list.get(0);
    System.out.println(error.getObjectName()+"," + error.getField() + "," + error.getDefaultMessage());
    }
    }
    

    此方法可以接受 HTTP 参数并映射到 WorkInfoForm对象,WorkInfoForm使用了@Validated注解,将触发Spring的校验,并将验证结果存放在BindingResult对象中。这里,Validated 注解使用了校验的上下文 WorkInfoForm.Add.class 因此,整个校验将按照 Add.class 来校验。

    BindingResult 包含了验证结果,提供了如下方法。

    hasErrors 判断验证是否通过。
    getAllError 得到所有的错误信息,通常返回的是 FieldError 列表

    如果 Controller 参数未提供 BindingReult 对象,则 SpringMVC 将抛出异常。

    自定义校验

    JSR-303 提供的大部分校验注解已经够用,也允许定制校验注解,比如在 WorkInfoForm 类中,我们新增加一个加班时间。

    @WorkOverTime(max=2)
    int workTime;
    

    属性 workTime 使用了注解 @WorkOverTime,属性值超过 max 值的时候,将会验证失败。WorkOverTime 跟其他注解差不多,但提供了 @Constraint 来说明用什么类作为验证注解实现类。

    @Constraint(validatedBy= {WorkOverTimeValidator.class})
    @Documented
    @Target({ ElementType.ANNOTATION_TYPE, ElementType.METHOD,ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface WorkOverTime {
    String message() default "加班时间过长,不能超过{max} 小时";
    int max() default 5;
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    }
    

    @Constraint注解声明用什么类来实现验证,我们将创建一个 WorkOverTimeValidator 来进行验证。验证注解必须要提供如下信息。

    message 用于创建错误信息
    groups 验证规则分组,比如新增和修改的验证规则不一样,分为两个组,验证注解必须提供
    payload 定义了验证的有效负荷

    WorkOverTimeValidator 必须实现 ConstraintValidator 接口 initialize 方法及验证方法 isValid;

    public class WorkOverTimeValidator implements ConstraintValidator<WorkOverTime, Integer> {
    WorkOverTime work;
    int max;
    public void initialize(WorkOverTime work) {
    thie.work = work;
    max = work.max();
    }
    
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
    if(value == null) {
    return true;
    }
    return value<max>;
    }
    }
    
  • 相关阅读:
    POJ 2195 Going Home (费用流)
    POJ 1087 A Plug for UNIX (网络流,最大流)
    凸包的直径——旋转卡壳
    凸包--Graham扫描法
    POJ 3167 Layout(差分约束)
    POJ 2187 Beauty Contest(凸包,旋转卡壳)
    HDU 1392 Surround the Trees(凸包)
    HDU 3416 Marriage Match IV(最短路,网络流)
    【USACO4.2】草地排水Drainage Ditches(最大流)
    【模板】网络最大流
  • 原文地址:https://www.cnblogs.com/dowhile/p/Spring-Boot-yan-zheng-biao-dan.html
Copyright © 2011-2022 走看看