Hibernate Validator校验
小编:管理员 367阅读 2022.09.14
- 官网地址
- spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依赖。
1. 导入包
import org.hibernate.validator.constraints.NotBlank; import javax.validation.constraints.AssertFalse; import javax.validation.constraints.Pattern;复制2. demo
@Getter @Setter @NoArgsConstructor public class DemoModel { @NotBlank(message="用户名不能为空") private String userName; @NotBlank(message="年龄不能为空") @Pattern(regexp="^[0-9]{1,2}$",message="年龄不正确") private String age; @AssertFalse(message = "必须为false") private Boolean isFalse; /** * 如果是空,则不校验,如果不为空,则校验 */ @Pattern(regexp="^[0-9]{4}-[0-9]{2}-[0-9]{2}$",message="出生日期格式不正确") private String birthday; }复制3. 结果返回
@RequestMapping("/demo2") public void demo2(@RequestBody @Valid DemoModel demo, BindingResult result){ if(result.hasErrors()){ for (ObjectError error : result.getAllErrors()) { System.out.println(error.getDefaultMessage()); } } }复制4. 传入参数
{"userName":"dd","age":120,"isFalse":true,"birthday":"21010-21-12"}复制5. 输出结果
出生日期格式不正确 必须为false 年龄不正确复制3. hibernate的校验模式
1. 普通模式(默认为该模式)
- 会校验所有属性,然后返回所有的验证失败信息。
- 只要有一个校验失败则返回。
// failFast: true 快速失败返回模式,false 普通模式 ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class ) .configure() .failFast( true ) .buildValidatorFactory(); Validator validator = validatorFactory.getValidator();复制
// hibernate.validator.fail_fast: true 快速失败返回模式,false 普通模式 ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class ) .configure() .addProperty( "hibernate.validator.fail_fast", "true" ) .buildValidatorFactory(); Validator validator = validatorFactory.getValidator();复制4. hibernate的校验
1. 请求参数校验
- 验证请求参数时,在 @RequestBody DemoModel demo 之间加注解 @Valid,然后在后面加 BindindResult 即可;多个参数,可以添加多个 @Valid 和 BindindResult。
public void test()(@RequestBody @Valid DemoModel demo, BindingResult result) public void test()(@RequestBody @Valid DemoModel demo, BindingResult result,@RequestBody @Valid DemoModel demo2, BindingResult result2)复制
@RequestMapping("/demo2") public void demo2(@RequestBody @Valid DemoModel demo, BindingResult result){ if(result.hasErrors()){ for (ObjectError error : result.getAllErrors()) { System.out.println(error.getDefaultMessage()); } } }复制2. GET参数校验(@RequestParam参数校验)3. model校验4. 对象级联校验
- 对象内部包含另一个对象作为属性,属性上加 @Valid,可以验证作为属性的对象内部的验证
1. 大小写校验器
public enum CaseMode { UPPER, LOWER; } @Target( { ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE }) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = CheckCaseValidator.class) @Documented public @interface CheckCase { String message() default ""; Class>[] groups() default {}; Class extends Payload>[] payload() default {}; CaseMode value(); } public class CheckCaseValidator implements ConstraintValidator复制2. Demo{ private CaseMode caseMode; public void initialize(CheckCase checkCase) { this.caseMode = checkCase.value(); } public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { if (s == null) { return true; } if (caseMode == CaseMode.UPPER) { return s.equals(s.toUpperCase()); } else { return s.equals(s.toLowerCase()); } } }
public class Demo{ @CheckCase(value = CaseMode.LOWER,message = "userName必须是小写") private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }复制3. Validator配置
@Bean public Validator validator(){ ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class ) .configure() .addProperty( "hibernate.validator.fail_fast", "true" ) .buildValidatorFactory(); Validator validator = validatorFactory.getValidator(); return validator; }复制4. 校验测试
@RequestMapping("/demo4") public void demo4(){ Demo demo = new Demo(); demo.setUserName("userName"); Set复制6. 常见的注解> validate = validator.validate(demo); for (ConstraintViolation dem : validate) { System.out.println(dem.getMessage()); } }
No. |
注解 |
解释 |
---|---|---|
01 |
@Null |
检查该字段为空 |
02 |
@NotNull |
不能为 null |
03 |
@NotBlank |
不能为空,检查时会将空格忽略 |
04 |
@NotEmpty |
不能为空,这里的空是指空字符串 |
05 |
@AssertTrue |
用于boolwan字段,只能为true |
06 |
@AssertFalse |
用于boolwan字段,只能为false |
07 |
@CreditCardNumber |
对信用卡进行一个大致的校验 |
08 |
@DecimalMin(value) |
数值类型,只能小于或等于value |
09 |
@DecimalMax(value) |
数值类型,只能大于或等于value |
10 |
@Digits(integer=2,fraction=20) |
限制必须为一个小数,整数部分位数不能超过integer,小数部分位数不能超过fraction |
11 |
|
检查是否是一个有效的email地址 |
12 |
@Past |
检查该字段的日期是否属于过去的日期 |
13 |
@Future |
检查该字段的日期是否属于将来的日期 |
14 |
@Length(min=,max=) |
检查该字段的长度是否在min和max之间,只能用于字符串 |
15 |
@Size(min=,max=) |
检查该字段的size是否在min和max之间,可以是字符串、数组、集合、map等 |
16 |
@Min(value) |
小于等于value |
17 |
@Max(value) |
大于等于value |
18 |
@URL(protocol=,host,port) 检查是否是一个有效的URL,如果提供来protocol,host等,则该url还需满足提供的条件 |
|
19 |
@Valid |
该注解只要用于字段为一个包含其他对象的集合或map或数组的字段,或该字段直接为一个其他对象的引用(这样在检查当前对象的同时也会检查该字段所引用的对象) |
相关推荐
- 经典笔试题-JDBC及Hibernate篇 五、JDBC 及Hibernate:(共12 题:基础10 道,中等难度2 道)110、数据库,比如100 用户同时来访,要采取什么技术解决?【基础】 答:可采用连接池。111、什么是ORM?【基础】 答:对象关系映射(Object—Relational Mapping,简称ORM)是一种为了解决面向对象…
- 3DMAX提示和技巧 本主题标识使用 Civil View 的一些重要提示和技巧。常规使用屏幕分辨率至少为 1280x1024 的 Civil View。低于此分辨率时,一些面板将占用过多屏幕空间。 将视口设置为线框显示以达到最佳性能。 要尽可能简化用户界面,请在单个视口中工作并关闭 3ds Max 命令面…