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

使用Spring注入Hibernate验证框架

程序员文章站 2022-06-21 22:02:52
目录spring注入hibernate验证框架spring配置文件hibernate内置的验证约束注解如下表所示springmvc使用hibernate的校验框架validation一、hiberna...

spring注入hibernate验证框架

spring配置文件

<!-- enables the spring mvc @controller programming model -->
 <mvc:annotation-driven validator="validator" />
 
 <!-- 配置数据校验 -->
 <bean id="messagesource"
  class="org.springframework.context.support.reloadableresourcebundlemessagesource">  
        <property name="basename" value="classpath:messages"/>
        <property name="fileencodings" value="utf-8"/>
        <property name="cacheseconds" value="10"/>
 </bean>
 <bean id="validator"
  class="org.springframework.validation.beanvalidation.localvalidatorfactorybean">  
        <property name="providerclass"
   value="org.hibernate.validator.hibernatevalidator"/>
  <property name="validationmessagesource" ref="messagesource"/>
 </bean>

hibernate内置的验证约束注解如下表所示

(摘自hibernate validator reference):

验证注解

验证的数据类型

说明

@assertfalse

boolean,boolean

验证注解的元素值是false

@asserttrue

boolean,boolean

验证注解的元素值是true

@notnull

任意类型

验证注解的元素值不是null

@null

任意类型

验证注解的元素值是null

@min(value=值)

bigdecimal,biginteger, byte,

short, int, long,等任何number或charsequence(存储的是数字)子类型

验证注解的元素值大于等于@min指定的value值

@max(value=值)

和@min要求一样

验证注解的元素值小于等于@max指定的value值

@decimalmin(value=值)

和@min要求一样

验证注解的元素值大于等于@ decimalmin指定的value值

@decimalmax(value=值)

和@min要求一样

验证注解的元素值小于等于@ decimalmax指定的value值

@digits(integer=整数位数, fraction=小数位数)

和@min要求一样

验证注解的元素值的整数位数和小数位数上限

@size(min=下限, max=上限)

字符串、collection、map、数组等

验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小

@past

java.util.date,

java.util.calendar;

joda time类库的日期类型

验证注解的元素值(日期类型)比当前时间早

@future

与@past要求一样

验证注解的元素值(日期类型)比当前时间晚

@notblank

charsequence子类型

验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@notempty,@notblank只应用于字符串且在比较时会去除字符串的首位空格

@length(min=下限, max=上限)

charsequence子类型

验证注解的元素值长度在min和max区间内

@notempty

charsequence子类型、collection、map、数组

验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@range(min=最小值, max=最大值)

bigdecimal,biginteger,charsequence, byte, short, int, long等原子类型和包装类型

验证注解的元素值在最小值和最大值之间

@email(regexp=正则表达式,

flag=标志的模式)

charsequence子类型(如string)

验证注解的元素值是email,也可以通过regexp和flag指定自定义的email格式

@pattern(regexp=正则表达式,

flag=标志的模式)

string,任何charsequence的子类型

验证注解的元素值与指定的正则表达式匹配

@valid

任何非原子类型

指定递归验证关联的对象;

如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@valid注解即可级联验证

springmvc使用hibernate的校验框架validation

一、hibernate中的validator需要的jar包

  • hibernate-validator-4.3.1.final.jar
  • jboss-logging-3.1.0.ga.jar
  • validation-api-1.1.0.final.jar

二、配置校验器

<!-- 校验器 -->
    <bean id="validator"
        class="org.springframework.validation.beanvalidation.localvalidatorfactorybean">
        <!-- 校验器-->
        <property name="providerclass" value="org.hibernate.validator.hibernatevalidator" />
        <!-- 指定校验使用的资源文件,如果不指定则默认使用classpath下的validationmessages.properties -->
        <property name="validationmessagesource" ref="messagesource" />
    </bean>
    <!-- 校验错误信息配置文件 -->
    <bean id="messagesource"
        class="org.springframework.context.support.reloadableresourcebundlemessagesource">
        <!-- 资源文件名-->
        <property name="basenames">   
            <list>    
            <value>classpath:customvalidationmessages</value>
            </list>   
        </property>
        <!-- 资源文件编码格式 -->
        <property name="fileencodings" value="utf-8" />
        <!-- 对资源文件内容缓存时间,单位秒 -->
        <property name="cacheseconds" value="120" />
    </bean>

三、校验器注册到处理器适配器中

<mvc:annotation-driven validator="validator"></mvc:annotation-driven>     

四、在pojo中添加校验规则

package acm.user.po; 
import javax.validation.constraints.notnull;
import javax.validation.constraints.size;
 
public class user {
    private integer id; 
    //校验名字1到30个字符中间
    //message是提示校验出错信息
    @size(min=1, max=30, message="{user.name.length.error}")
    private string name; 
    //非空校验
    @notnull(message="{user.num.nonull}")
    private string num; 
    private string sex; 
    private string tel;
            .
            .
            .
            .
    public integer getid() {
        return id;
    } 
    public void setid(integer id) {
        this.id = id;
    } 
}

配置文件中的代码

user.name.length.error=请输入1到30个字符的名字
user.num.nonull=请输入商品的生产日期

五、controller测试

@requestmapping(value = "updateuser")
public string updateuser(@validated user user, bindingresult bindingresult){
    list<objecterror> allerrors = bindingresult.getallerrors();
    //获得错误信息
    for(objecterror e : allerrors){
        //输出错误信息
        system.out.println(e.getdefaultmessage());   
    }
    try{
        int count = userservice.updateuser(user);
    } catch(exception e){
        e.printstacktrace();
    }
    return "message";
} 

分组校验:

定义多个校验分组,分组中定义有些规则

每个controller方法中定义不同的校验分组

定义一个接口,里面可以不写东西,用来装一个分组

在pojo中写出每一个被校验的字段属于哪一个分组

//校验名字1到30个字符中间
//message是提示校验出错信息
//标识此校验属于哪个分组,group也可属于多个分组
@size(min=1, max=30, message="{user.name.length.error}", groups={validation1.class})
private string name;

在controller里使用分组校验

@validated中的参数指向那个检验分组
@requestmapping(value = "updateuser")
public string updateuser(@validated(value={validation1.class}) user user, bindingresult bindingresult){
    if(bindingresult.haserrors()){
        list<objecterror> allerrors = bindingresult.getallerrors();
        //获得错误信
       for(objecterror e : allerrors){
            //输出错误信息
            system.out.println(e.getdefaultmessage());
        }
    }
    try{
        int count = userservice.updateuser(user);
    } catch(exception e){
        e.printstacktrace();
    }
    return "message";
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。