今天被hiberna-validation校验整的有点晕,不过理清思路后,才发现真正导致这个错的原因还是自己太粗心了,记录下!首先是环境搭建,没错——加入jar包,使用maven的话就方便多了。
pom.xml中加入以下jar包依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
其他依赖的jar包会自动加入
加好jar包后,就在springmvc的配置文件中进行配置。
<!-- 校验器 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- hibernate校验器-->
<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>
messageSource的basenames属性,只取属性文件的名字即可,不用再加后缀。我把这个属性文件放在src下,所以路径如以上配置。
需要注意的是 资源文件名的配置,这里只需写上名字而不需要后缀,并且我是把这个属性文件放在src目录下,springmvc的配置文件也放在src目录下,本以为在同一个目录就不需要指定classpath下了,结果一直读不到属性文件,所以这里一定还是
classpath:CustomValidationMessages
指明classpath。配置完了校验器,怎么才能让校验器生效呢?校验可以使用页面js进行校验,但若想安全级别更高还是在服务器端的校验。校验有三个层次的校验:表现层(controller)的校验,业务层(Service)的校验(使用最多),持久层dao的校验(一般不在持久层进行校验)。
springmvc有前端控制器、处理器映射器、处理器适配器,视图解析器,处理器适配器是要执行handler(即controller)的,所以,无论是在controller校验,还是在Service校验都要将校验器配置在处理器适配器中,这里我使用了注解式的配置
<mvc:annotation-driven validator="validator"/>
注册完就可以使用这个校验器进行校验了
这里我做的小例子是校验dinnertable这个类里的tablename这个属性的长度在1到30个字符,orderdate这个属性不为空
@Size(min = 1,max = 30,message = "{dinnertable.tablename.length}")
public String getTablename() {
return tablename;
}
@NotNull(message = "{dinnertable.orderdate}")
public Date getOrderdate() {
return orderdate;
}
校验注解可以加在字段上、也可以加在属性上,但一定加在属性的getter方法上。message = “{dinnertable.orderdate}”注解的message属性定义了校验失败的错误信息,默认在hibernate-validator的jar包中org.hibernate.validator ResourceBundle下有校验失败的错误信息,
javax.validation.constraints.Null.message = must be null
javax.validation.constraints.Past.message = must be in the past
javax.validation.constraints.Pattern.message = must match "{regexp}"
javax.validation.constraints.Size.message = size must be between {min} and {max}
这里我取除了几个,可以重写其中的错误信息。其中的键呢,也都是javax.validation.constraints+注解名+message,那为了不影响其间冲突,我这里自定义了键值,看下属性文件
#添加校验的错误提示信息
dinnertable.tablename.length =\u8bf7\u8f93\u5165 {min}\u5230{max}\u4e2a\u5b57\u7b26\u7684\u9910\u684c\u540d\u79f0
dinnertable.orderdate =\u8bf7\u8f93\u5165\u9910\u684c\u9884\u5b9a\u65f6\u95f4
其中还使用了{max},这里就是在注解中定义的max的值后面的ascii是我通过native2ascii.exe在cmd窗口生成的
界面的代码我简单写了个form这里就不贴了直接到controller
@RequestMapping(value = "/testConverter",method=RequestMethod.POST)
public String testConverter(@Validated Dinnertable dinnertable, BindingResult bindingResult ){
if(bindingResult.hasErrors()){
List<ObjectError> errors=bindingResult.getAllErrors();
for(ObjectError error:errors){
System.out.println( error.getDefaultMessage());
}
}
return "forward:../after/detail/boardList.jsp";
}
@Validated 和BindingResult bindingResult必须在要校验的数据两边,一前一后,有几个要校验的数据就写几个,校验失败的错误信息就放到了bindingResult中,取出如图上,接下来,要将错误信息显示到哪里就看个人需求了
时间仓促,知识浅薄,若有遗漏或错误之处,多多指出