在springmvc中使用hibernate-validate

来源:互联网 发布:英语学习软件开发 编辑:程序博客网 时间:2024/05/01 21:52

在项目开发过程中,后台在很多场景都需要进行校验操作,比如:前台表单提交到后台,系统接口调用,数据传输等等。而且很多项目都采用MVC分层式设计,每层还有需要进行相应地校验,这样在项目较大,多人协作开发的时候,会造成大量重复校验代码,且出错率高。

针对这个问题, JCP 出台一个 JSR 303-Bean Validation规范 ,目前我所知道的带表单验证功能的是一个协议JSR303,包括EJP、hibernatespring和apache都有类似库,而Hibernate Validator 作为Bean Validation的参考实现,提供了JSR 303规范中所有内置constraint的实现,除此之外还有一些附加的constraint。

Hibernate Validation的使用非常简单,只用在相应的实体类中加上注解,再调用对应的校验API方法即可。


在springmvc.xml中加入

复制代码
 1 <!-- 国际化配置 -->     2     <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" /> 3     <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 4         <property name="basenames"> 5             <list> 6                 <value>classpath:resource/ValidationMessages</value> 7             </list> 8         </property> 9         <property name="useCodeAsDefaultMessage" value="true" />10     </bean>11     <!-- 注册验证器 -->12     <mvc:annotation-driven validator="validator" />13 14     <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">15         <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />16         <!-- 这里配置将使用上面国际化配置的messageSource -->17         <property name="validationMessageSource" ref="messageSource" />18     </bean> 
复制代码

 

资源文件(可以省略不写,这样错误信息就直接写中文即可)

复制代码
1 val.age.message=\u5E74\u9F84\u4E0D\u80FD\u8D85\u8FC720\u5C812 3 username.not.null=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A4 pwd.not.null=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A5 username.length=\u7528\u6237\u540D\u6700\u5927\u4E0D\u80FD\u8D85\u8FC7{max},\u6700\u5C0F\u4E0D\u80FD\u5C11\u4E8E{min}6 7 email.format.error=\u90AE\u7BB1\u683C\u5F0F\u4E0D\u6B63\u786E
复制代码

 

被验证的bean:

复制代码
  1 package com.lee.web.entity;  2   3 import javax.validation.constraints.Max;  4 import javax.validation.constraints.Pattern;  5   6 import org.hibernate.validator.constraints.Email;  7 import org.hibernate.validator.constraints.Length;  8 import org.hibernate.validator.constraints.NotBlank;  9  10 public class ValBean { 11      12      13     /** 14      * Bean Validation 中内置的 constraint        15      * @Null   被注释的元素必须为 null        16      * @NotNull    被注释的元素必须不为 null        17      * @AssertTrue     被注释的元素必须为 true        18      * @AssertFalse    被注释的元素必须为 false        19      * @Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值        20      * @Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值        21      * @DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值        22      * @DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值        23      * @Size(max=, min=)   被注释的元素的大小必须在指定的范围内        24      * @Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内        25      * @Past   被注释的元素必须是一个过去的日期        26      * @Future     被注释的元素必须是一个将来的日期        27      * @Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式        28      * Hibernate Validator 附加的 constraint        29      * @NotBlank(message =)   验证字符串非null,且长度必须大于0        30      * @Email  被注释的元素必须是电子邮箱地址        31      * @Length(min=,max=)  被注释的字符串的大小必须在指定的范围内        32      * @NotEmpty   被注释的字符串的必须非空        33      * @Range(min=,max=,message=)  被注释的元素必须在合适的范围内  34      */ 35     private Long id; 36  37     @Max(value=20, message="{val.age.message}")    38     private Integer age; 39      40     @NotBlank(message="{username.not.null}") 41     @Length(max=6, min=3, message="{username.length}") 42     private String username; 43  44     @NotBlank(message="{pwd.not.null}") 45     @Pattern(regexp="/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,10}$/", message="密码必须是6~10位数字和字母的组合") 46     private String password; 47      48      49     @Pattern(regexp="^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$", message="手机号格式不正确") 50     private String phone; 51  52     @Email(message="{email.format.error}") 53     private String email; 54  55     public Long getId() { 56         return id; 57     } 58  59     public void setId(Long id) { 60         this.id = id; 61     } 62  63     public String getUsername() { 64         return username; 65     } 66  67     public void setUsername(String username) { 68         this.username = username; 69     } 70  71     public String getPassword() { 72         return password; 73     } 74  75     public void setPassword(String password) { 76         this.password = password; 77     } 78  79     public String getPhone() { 80         return phone; 81     } 82  83     public void setPhone(String phone) { 84         this.phone = phone; 85     } 86  87     public String getEmail() { 88         return email; 89     } 90  91     public void setEmail(String email) { 92         this.email = email; 93     } 94  95     public Integer getAge() { 96         return age; 97     } 98  99     public void setAge(Integer age) {100         this.age = age;101     }102 }
复制代码

controller,json form或者作为rest接口,都行

复制代码
 1 @RequestMapping(value = "/val", method=RequestMethod.POST) 2     @ResponseBody 3     public LeeJSONResult val(@Valid @RequestBody ValBean bean, BindingResult result) throws Exception { 4          5         if(result.hasErrors()){     6             //如果没有通过,跳转提示     7             Map<String, String> map = getErrors(result); 8             return LeeJSONResult.error(map); 9         }else{    10             //继续业务逻辑    11         } 12         13         return LeeJSONResult.ok();14     }15     16     private Map<String, String> getErrors(BindingResult result) {17         Map<String, String> map = new HashMap<String, String>();18         List<FieldError> list = result.getFieldErrors();19         for (FieldError error : list) {20             System.out.println("error.getField():" + error.getField());21             System.out.println("error.getDefaultMessage():" + error.getDefaultMessage());22             23             map.put(error.getField(), error.getDefaultMessage());24         }25         return map;26     }
0 0