JAVA中通过Hibernate-Validation进行参数验证

Hibernate-Validation?

Hibernate-Validation是Hibernate框架中一套独立的后端校验框架,用于做参数的验证的;它是JSR303-Bean Validation规范的实现方案。

JSR?

JSR是Java Specification Requests的缩写,意思是Java 规范提案,用于指定java的标准。

Bean Validation?

Bean Validation是JSR中的303规范,用于提供Bean属性的相关校验规则。

Hibernate Validation提供的约束注解

  1. Bean Validation 中内置的约束注解

    @Null 被注释的元素必须为 null
    @NotNull 被注释的元素必须不为 null
    @AssertTrue 被注释的元素必须为 true
    @AssertFalse 被注释的元素必须为 false
    @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
    @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
    @Past 被注释的元素必须是一个过去的日期
    @Future 被注释的元素必须是一个将来的日期
    @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

  2. Hibernate Validator 附加的约束注解

    @NotBlank(message =) 验证字符串非null,且长度必须大于0
    @Email 被注释的元素必须是电子邮箱地址
    @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
    @NotEmpty 被注释的字符串的必须非空
    @Range(min=,max=,message=) 被注释的元素必须在合适的范围内

@NotNull @NotEmpty @NotBlank三个注解的区别

@NotNull 任何对象的value不能为null
@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null
@NotBlank 只能用于字符串不为null,并且字符串trim()去掉空格,以后length要大于0

使用实例

  1. 添加依赖

    pom.xml

    <!--导入校验的jsr303规范API-->
    <dependency>
    	<groupId>javax.validation</groupId>
    	<artifactId>validation-api</artifactId>
    	<version>2.0.1.Final</version>
    </dependency>
    
    <!--导入校验框架实现技术-->
    <dependency>
    	<groupId>org.hibernate</groupId>
    	<artifactId>hibernate-validator</artifactId>
    	<version>6.1.0.Final</version>
    </dependency>
    
  2. 使用注解(303规范用于约束bean的属性)

    User

    public class User {
        
        //此注解表示该属性不能为空
        @NotBlank(message = "姓名不能为空")
        private String name;
        private Integer age;
    	//构造方法、get、set方法省略...
    }
    
  3. 在Controller层校验

    校验方法

    /**
     * @param user   用户实体
     * @param errors 错误对象
     */
    @RequestMapping("/standard/demo")
    @ResponseBody
    public void demo(@Valid User user, Errors errors) {
    	System.out.println(user);
    	//判断对象中是否有错误,false表示没有错误, true表示有错误
    	boolean bl = errors.hasErrors();
    
    	if (bl) {
    		//获取字段的错误集合
    		List<FieldError> fieldErrors = errors.getFieldErrors();
    		//遍历
    		for (FieldError fieldError : fieldErrors) {
    			//获取出现错误的字段名
    			String field = fieldError.getField();
    			//获取出现错误的字段消息
    			String defaultMessage = fieldError.getDefaultMessage();
    			System.out.println(field);
    			System.out.println(defaultMessage);
    		}
    	}
    
    }
    
  4. 页面表单

    <form action="/standard/demo">
        姓名:<input type="text" name="name">
        年龄:<input type="text" name="age">
        <input type="submit" value="提交">
    </form>
    
  5. 结果

    在这里插入图片描述

对同一个字段进行多个约束条件的校验

public class User {
    
    //此注解表示该属性不能为空
    @NotBlank(message = "姓名不能为空")
    private String name;
    
    //首先不能为空校验
    @NotNull(message = "年龄不能为空")
    //对年龄的大小进行范围校验
    @Max(value = 60,message = "最大年龄不能超过60")
    @Min(value = 18,message = "最小年龄不能低于18")
    private Integer age;
    
	//构造方法、get、set方法省略...
}

控制层方法与页面表单不变

对引用类型的校验

对于引用类型的校验,需要在引用字段上加上@Valid注解,表示开启注解,而在其引用的类的字段上,需要编写校验规则。

  • User.java

    public class User {
        
        private String name;
        private Integer age;
    
        //开启校验
        @Valid
        private Address address;
        
        //get set方法省略
    }
    
  • Address.java

    public class Address {
    
        @NotBlank(message = "地址不能为空!")
        private String name;
    	
        //get set方法省略
    }
    
  • 表单

    <form action="/standard/demo">
        姓名:<input type="text" name="name">
        年龄:<input type="text" name="age">
        地址:<input type="text" name="address.name">
        <input type="submit" value="提交">
    </form>
    
  • 控制层处理方法不变

  • 结果

    在这里插入图片描述

分组校验

  1. 首先创建一个接口,用于做分组,里面什么都不用写,只是当做一个分组标识

    public interface GroupA {
    }
    
  2. 将不同的校验规则进行分组

    User.java

    public class User {
    
        /*
            此注解表示该属性不能为空
            groups = {GroupA.class}:校验规则加入A组
        */
        @NotBlank(message = "姓名不能为空", groups = {GroupA.class})
        private String name;
    
        //首先不能为空校验
        @NotNull(message = "年龄不能为空")
        //对年龄的大小进行范围校验
        @Max(value = 60,message = "最大年龄不能超过60")
        @Min(value = 18,message = "最小年龄不能低于18")
        private Integer age;
        
        //get set方法省略
    }
    
  3. 表单

    <form action="/standard/demo">
        姓名:<input type="text" name="name">
        年龄:<input type="text" name="age">
        <input type="submit" value="提交">
    </form>
    
  4. 在控制层使用@Validated注解,指定对哪组的规则进行校验

    /**
     * @param user   用户实体
     * @param errors 错误对象
     */
    @RequestMapping("/standard/demo")
    @ResponseBody
    public void demo(@Validated(GroupA.class) User user, Errors errors) {
    	System.out.println(user);
    	//判断对象中是否有错误,false表示没有错误, true表示有错误
    	boolean bl = errors.hasErrors();
    
    	if (bl) {
    		//获取字段的错误集合
    		List<FieldError> fieldErrors = errors.getFieldErrors();
    		//遍历
    		for (FieldError fieldError : fieldErrors) {
    			//获取出现错误的字段名
    			String field = fieldError.getField();
    			//获取出现错误的字段消息
    			String defaultMessage = fieldError.getDefaultMessage();
    			System.out.println(field);
    			System.out.println(defaultMessage);
    		}
    	}
    
    }
    

    @Validated(GroupA.class)表示只针对A组的规则进行校验。

  5. 结果

    在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值