springboot整合Hibernate-Invalidator
中国加油,武汉加油!
篇幅较长,配合右边目录观看
项目准备
- 创建springboot项目nz1904-springboot-06-invalidator
- 加入Spring的web依赖和Lombox依赖
- 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 |
邮箱判断 | |
@length | 长度判断 |
@NotEmpty | 字符串非空 |
@Range | 表示元素必须在指定范围内 |