欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Hibernate validator使用以及自定义校验器注解

程序员文章站 2022-04-18 09:45:59
jsr-303 是 java ee 6 中的一项子规范,叫做 bean validation,用于对 java bean 中的字段的值进行验证。hibernate validator则...

jsr-303 是 java ee 6 中的一项子规范,叫做 bean validation,用于对 java bean 中的字段的值进行验证。hibernate validator则是hibdernate提供的一种对该规范的实现。

——即hibernate validator是用来做参数校验。

使用hibernate validator提供的注解进行参数校验

注解 释义
@null 必须为null
@notnull 不能为null
@asserttrue 必须为true
@assertfalse 必须为false
@min 必须为数字,其值大于或等于指定的最小值
@max 必须为数字,其值小于或等于指定的最大值
@decimalmin 必须为数字,其值大于或等于指定的最小值
@decimalmax 必须为数字,其值小于或等于指定的最大值
@size 集合的长度
@digits 必须为数字,其值必须再可接受的范围内
@past 必须是过去的日期
@future 必须是将来的日期
@pattern 必须符合正则表达式
@email 必须是邮箱格式
@length 长度范围
@notempty 不能为null,长度大于0
@range 元素的大小范围
@notblank 不能为null,字符串长度大于0(限字符串)

引入依赖

<dependency>
 <groupid>org.hibernate</groupid>
 <artifactid>hibernate-validator</artifactid>
 <version>6.0.15.final</version>
</dependency>

hibernate validator常用注解

创建测试类

注意必须先进行为null判断,否则其他注解有的不会生效。
比如username加了@length而不加@notnull注解,当没有输入username,那么@length判断将不会生效,判断为null的有@notnull、@notempty以及@notblank
建议自行去掉@notnull再测试一下

package com.dfyang.validator.entity;

import org.hibernate.validator.constraints.length;
import org.hibernate.validator.constraints.range;
import javax.validation.constraints.notblank;

public class user {
 @notblank(message = "名称不能为空")
 private string name;

 @range(min = 1, max = 120, message = "年龄必须为1-120岁")
 private integer age;

 @notblank(message = "描述不能为空")
 private string description;

 @notnull
 @length(min = 6, max = 18, message = "用户名长度必须为6-18位")
 private string username;

 @notnull
 @length(min = 6, max = 18, message = "密码长度必须为6-18位")
 private string password;

 /** get、set方法 */
}

创建测试controller

@valid用在参数上,表示对该参数进行校验。

如果对参数校验发现有误,会将错误注入到bindingresult中

我们这里将错误进行打印,也可以直接抛出异常

package com.dfyang.validator.controller;

import com.dfyang.validator.entity.user;
import org.springframework.validation.bindingresult;
import org.springframework.validation.objecterror;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.responsebody;
import org.springframework.web.bind.annotation.restcontroller;

import javax.validation.valid;

@restcontroller
public class usercontroller {

 @getmapping("/insert")
 @responsebody
 public user insertuser(@valid user user, bindingresult result) {
  if (result.haserrors()) {
   for (objecterror error : result.getallerrors()) {
    system.err.println(error.getdefaultmessage());
   }
  }
  return user;
 }
}

输入 http://localhost:8080/insert?name=张三&descripyion=&age=0&username=123123

Hibernate validator使用以及自定义校验器注解

使用自定义校验器进行参数校验

创建自定义注解,用于判断年龄是否符合约束

package com.dfyang.validator.constraint;

import javax.validation.constraint;
import javax.validation.payload;
import java.lang.annotation.elementtype;
import java.lang.annotation.retention;
import java.lang.annotation.retentionpolicy;
import java.lang.annotation.target;

/**
 * 性别约束
 */
@target({ elementtype.field})
@retention(retentionpolicy.runtime)
@constraint(validatedby = sexconstraintvalidator.class)
public @interface sex {

 string message() default "性别有误";

 class<?>[] groups() default { };

 class<? extends payload>[] payload() default { };
}

判断注解的值是否符合约束,这里进行了为null判断,也可以不进行在多加一个@nutnull

package com.dfyang.validator.constraint;

import javax.validation.constraintvalidator;
import javax.validation.constraintvalidatorcontext;

/**
 * 性别约束逻辑判断
 */
public class sexconstraintvalidator implements constraintvalidator<sex, string> {
 @override
 public boolean isvalid(string value, constraintvalidatorcontext context) {
  return value != null && (value.equals("男") || value.equals("女"));
 }
}

@target用于指定使用范围,该处限定只能在字段上使用
@retention(retentionpolicy.runtime)表示注解在运行时可以通过反射获取到
@constraint(validatedby = xxx.class)指定该注解校验逻辑

2.创建校验实体,使用hibernate validator自带注解以及自定义的注解

package com.dfyang.validator.entity;

import com.dfyang.validator.constraint.sex;
import org.hibernate.validator.constraints.length;
import org.hibernate.validator.constraints.range;

import javax.validation.constraints.notblank;
import javax.validation.constraints.notnull;

public class user {
 @notblank(message = "名称不能为空")
 private string name;

 @range(min = 1, max = 120, message = "年龄必须为1-120岁")
 private integer age;

 @sex
 private string sex;

 @notblank(message = "描述不能为空")
 private string description;

 @notnull(message = "用户名不能为空")
 @length(min = 6, max = 18, message = "用户名长度必须为6-18位")
 private string username;

 @notnull(message = "密码不能为空")
 @length(min = 6, max = 18, message = "密码长度必须为6-18位")
 private string password;
 
 /** 省略get、set */
}

Hibernate validator使用以及自定义校验器注解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。