springboot篇】十三. springboot整合invalidator

springboot整合Hibernate-Invalidator

中国加油,武汉加油!

篇幅较长,配合右边目录观看

项目准备

  1. 创建springboot项目nz1904-springboot-06-invalidator
  2. 加入Spring的web依赖和Lombox依赖
  3. spirngboot项目里面内置了invalidator依赖。

1. 案例:测试对象

1.1 定义一个User

注意@NotNull的包为 javax.validation.constraints.NotNull;


package com.wpj.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotNull;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer id;

    @NotNull(message = "姓名不能为空")
    @Length(min = 6, max = 10, message = "姓名长度为6~10位")
    private String name;
    @NotNull(message = "密码不能为空")
    @Length(min = 6, max = 10, message = "密码长度为6~10位")
    private String pwd;

}

1.2 定义一个Controller

package com.wpj.controller;

import com.wpj.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@RestController
public class UserController {

    private Logger logger = LoggerFactory.getLogger(UserController.class);

    /**
     *  传递对象进行校验
     *      用户名和密码不能为null,且长度为6~10位
     * @param user
     * @param result    校验没通过,封装到这里
     * @return
     */
    @RequestMapping("/register")
    public String register(@Valid User user, BindingResult result) {
        // 如果校验有错就返回这里
        if (result.hasFieldErrors()) {
            List<FieldError> fieldErrors = result.getFieldErrors();
            for (FieldError f: fieldErrors) {
                String field = f.getField();
                String message = f.getDefaultMessage();
                logger.info("校验出错的例子是: " + field+", 校验的提示信息是: " + message);
            }
        }
        return "测试数据校验....";
    }
}

1.3 启动主启动类

在这里插入图片描述

1.4 测试数据

1.4.1 不传参数

在这里插入图片描述

1.4.1 传一个参数

在这里插入图片描述

1.4.3 传两个参数

在这里插入图片描述

1.4.3 传长度为6~10位之间的两个参数

在这里插入图片描述

1.5 测试对象完成

2. 案例:测试方法(不常用)

2.1 开启Hibernate-invalidator 对方法参数校验的支持

定义一个Config类

package com.wpj.config;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

@SpringBootConfiguration
public class AppConfig {

    /**
     * 开启Hibernate-invalidator 对方法当个参数校验的支持
     * @return
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor(){
        return new MethodValidationPostProcessor();
    }
    
}

2.2 Controller开启对数据参数的注解

@RestController
@Validated // 校验单个数据的方法的时候使用的
public class UserController {
	...
}

2.3 定义controller方法

@RequestMapping(value ="/register2")
public String register2( @NotNull(message = "姓名不能为空") @Length(min = 6, max = 10, message = "姓名长度为6~10位") String name,
                         @NotNull(message = "密码不能为空") @Length(min = 6, max = 10, message = "密码长度为6~10位") String pwd) {

    return "测试数据校验(方法)....";
}

2.4 测试

2.4.1 传不符合的参数

在这里插入图片描述

2.4.2 传正确的参数

在这里插入图片描述

3. Hibernate-invalidator的校验模式

3.1 . 校验模式的问题

3.1.1 普通校验模式

所有字段都要校验,而且校验不通过就输出

3.1.2 快速校验模式

3.2 配置快速校验(一般不做)

AppConfig类中配置校验规则

/**
 * 配置校验的规则 是普通校验呢还是快速校验
 * @return
 */
@Bean
public Validator validator(){
    ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
            .configure()
            .addProperty("Hibernate.validator.fail_fast", "true")  //true:表示的快速校验    false:普通的校验
            .buildValidatorFactory();
    return validatorFactory.getValidator();
}

4. 分组校验

注册的时候所有数据都要校验
登录的时候只需要校验账户和密码,其他信息可不用校验

4.1 User定义新属性

在这里插入图片描述

4.2 定义2个空接口,见名知意

在这里插入图片描述

4.3 给User里面的属性分组

@NotNull(message = "姓名不能为空", groups = {Register.class, Login.class})
@Length(min = 6, max = 10, message = "姓名长度为6~10位", groups = {Register.class, Login.class})
private String name;
@NotNull(message = "密码不能为空", groups = {Register.class, Login.class})
@Length(min = 6, max = 10, message = "密码长度为6~10位", groups = {Register.class, Login.class})
private String pwd;

@NotNull(message = "邮箱不能为空", groups = {Register.class})
@Email(message = "不是邮箱地址", groups = {Register.class})
private String eamil;

4.4 Controller定义login方法

这里修改了参数的注解@Validated

@RequestMapping("/login")
public String login(@Validated(Login.class) User user, BindingResult result) {
    // 如果校验有错就返回这里
    if (result.hasFieldErrors()) {
        List<FieldError> fieldErrors = result.getFieldErrors();
        for (FieldError f: fieldErrors) {
            String field = f.getField();
            String message = f.getDefaultMessage();
            logger.info("校验出错的例子是: " + field+", 校验的提示信息是: " + message);
        }
    }
    return "测试数据校验(登录)....";
}

4.5 测试

4.5.1 没有分组校验

需要把AppConfig的方法注释掉和Controller上的@Validated注释掉
在这里插入图片描述

4.5.2 分组校验

在这里插入图片描述

5 常见的注解

注解 作用
@Null 元素必须为空
@NotNull 元素不能为空
@AssertTrue 元素必须要true
@AssertFalse 元素必须为false
@min/@DecimalMin 元素的值必须为一个数字,这个数字的值必须大于等于最小值
@max/@DecimalMax 元素的值必须为一个数字,这个数字的值必须小于等于最大值
@Size 表示元素的大小在指定范围内
@Part 表示元素的值,必须是一个过期的时间
@Future 表示元素的值,必须是一个将来的时间
@Pattren(rex=xxx) 正则表达式判断
@NotBlank 字符串非null,长度必须大于0
@Email 邮箱判断
@length 长度判断
@NotEmpty 字符串非空
@Range 表示元素必须在指定范围内
发布了56 篇原创文章 · 获赞 11 · 访问量 4070

猜你喜欢

转载自blog.csdn.net/TheNew_One/article/details/104478304