hibernate-validator+SpringMVC
简介:简单说,就是对Entity进行校验。
1、导包,没有很严谨的对应关系,所以我用了比较新的版本,支持更多的注解。
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.5.Final</version> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator-cdi</artifactId> <version>6.0.5.Final</version> </dependency>
2、Spring配置文件中:
<!-- swagger2 --> <!--http://localhost:8080/zztabc/swagger-ui.html#/--> <!--<mvc:default-servlet-handler /> <mvc:resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/" />--> <mvc:annotation-driven validator="validator"/> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/> <property name="validationMessageSource" ref="messageSource"/> </bean> <!-- 校验错误信息配置文件 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <!-- 资源文件名 --> <!--<property name="basename" value="classpath:validationMessages"/>--> <!-- 对资源文件内容缓存时间,单位秒 --> <property name="fileEncodings" value="GBK"/> <property name="defaultEncoding" value="GBK"/> <property name="cacheSeconds" value="120"/> </bean>
3、entity:
package com.zztabc.controller.vali; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; import javax.validation.constraints.*; import java.io.Serializable; import java.util.List; /** * 员工表 * @author ZX * */ public class Emp implements Serializable{ private static final long serialVersionUID = 1L; @NotBlank(message="名字不能为空或者空串") @Length(min=2,max=10,message="名字必须由2~10个字组成") private String name; @NotNull @Min(value = 18,message = "年龄应该小于18") private Integer age; @NotNull @Max(value = 50,message = "年龄不能大于50") private Integer ageMax; @NotBlank @Pattern( regexp = "/^[a-z0-9_-]{3,16}$/",message = "用户名为3-16位整数+英文") private String loginName; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getAgeMax() { return ageMax; } public void setAgeMax(Integer ageMax) { this.ageMax = ageMax; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } @Override public String toString() { return "Emp{" + "name='" + name + '\'' + '}'; } }
4、controller:
/** @Valid Emp e 被验证的Bean前添加@Valid BindingResult br 每个被验证对象后面都跟一个BindingResult对象,里面持有错误返回信息。 */ @RequestMapping("/hi2") public ModelAndView sayHello2(@Valid Emp e ,BindingResult br){ ModelAndView mov = new ModelAndView("hello"); if(br.hasErrors()) { System.out.println("校验出错"); /* FieldError fieldError= br.getFieldError(); System.out.println(fieldError.getDefaultMessage());*/ /* List<ObjectError> ls=br.getAllErrors(); for (int i = 0; i < ls.size(); i++) { System.out.println("error:"+ls.get(i).getDefaultMessage()); }*/ List<FieldError> list = br.getFieldErrors(); for (FieldError fieldError2 : list) { System.out.println("属性名"+fieldError2.getField()+">>>"+fieldError2.getDefaultMessage()); //jsp展示用 mov.addObject(fieldError2.getField()+"Tip",fieldError2.getDefaultMessage()); } } return mov; }
5、jsp返回值:
一般框架提供了标签进行直接显示统一返回数据,但是不够灵活,所以我没有看那种方式,我在controller中获取到属性以及报错信息set进了ModelAndView对象,直接使用${属性名Tip}进行取值即可。
6、注解详解(摘抄自:):
@Valid 被注释的元素是一个对象,需要检查此对象的所有字段值 @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(value) 被注释的元素必须符合指定的正则表达式 2. Hibernate Validator 附加的 constraint 注解 作用 @Email 被注释的元素必须是电子邮箱地址 @Length(min=, max=) 被注释的字符串的大小必须在指定的范围内 @NotEmpty 被注释的字符串的必须非空 @Range(min=, max=) 被注释的元素必须在合适的范围内 @NotBlank 被注释的字符串的必须非空 @URL(protocol=, host=, port=, regexp=, flags=) 被注释的字符串必须是一个有效的url @CreditCardNumber 被注释的字符串必须通过Luhn校验算法, 银行卡,信用卡等号码一般都用Luhn 计算合法性 @ScriptAssert (lang=, script=, alias=) 要有Java Scripting API 即JSR 223 ("Scripting for the JavaTM Platform")的实现 @SafeHtml (whitelistType=, additionalTags=) classpath中要有jsoup包 hibernate补充的注解中,最后3个不常用,可忽略。 主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别: @NotNull 任何对象的value不能为null @NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null @NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0