在springmvc中使用hibernate-validate
一.在springmvc.xml配置文件中进行如下配置:
<!-- 下面的validator是配置校验信息的指向下面的 一个id为validator的bean -->
<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
<!-- 校验器的配置 -->
<!-- 国际化配置 -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:CustomValidatorMessage</value>
<!--上面这行就是配置的错误信息提示文件CustomValidatorMessage.properties的路径-->
</list>
</property>
<property name="useCodeAsDefaultMessage" value="true" />
</bean>
<!-- 注册验证器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
<!-- 这里配置将使用上面国际化配置的messageSource -->
<property name="validationMessageSource" ref="messageSource" />
</bean>
二:错误提示信息CustomValidatorMessage.properties文件的配置(最好配置,也可以不配置)
其中键的话会在下面用到,后面的值则是具体的错误信息提示。
三:需要被验证的bean对象
package com.ydg.web_taskList.user.po;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import com.ydg.web_taskList.user.validated.validatedGroup1;
public class User {
/**
* Bean Validation 中内置的 constraint
* @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=) 被注释的元素必须符合指定的正则表达式
* Hibernate Validator 附加的 constraint
* @NotBlank(message =) 验证字符串非null,且长度必须大于0
* @Email 被注释的元素必须是电子邮箱地址
* @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
* @NotEmpty 被注释的字符串的必须非空
* @Range(min=,max=,message=) 被注释的元素必须在合适的范围内
*/
private String userid;
//需要验证信息的属性的话就可以在相应的属性前面加上上面提到的注解,message是错误信息的提示内容,有两种格式可以用:
第一种:直接在message里面直接把相应的错误信息写上去例如:@NotBlank(message="用户名不能为空",groups={validatedGroup1.class})这种的话会硬编码不建议使用。
第二种:则是配置第二步提到的CustomValidatorMessage.properties文件,注解中的message的{username.not.null}对应配置文件中的键
@NotBlank(message="{username.not.null}",groups={validatedGroup1.class})
@Length(max=50, min=3, message="{username.length}",groups={validatedGroup1.class})
private String username;
@NotBlank(message="{userpassword.not.null}",groups={validatedGroup1.class})
@Pattern(regexp="/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,10}$/", message="{userpassword.format}",groups={validatedGroup1.class})
private String userpassword;
@NotBlank(message="{useremail.not.null}",groups={validatedGroup1.class})
@Email(message="{email.format}")
private String useremail;
}
四:controller,json form或者作为rest接口中的应用
@RequestMapping(value = "/userLogin.action")
public String userLogin(
@Validated(value = { validatedGroup1.class }) User user,BindingResult bindingResult
, HttpServletRequest request,HttpServletResponse response) throws Exception {
if(validateUser(bindingResult,request)){
return "user/login";
}
request.setAttribute("user",userServiceImpl.getUser(user));
return "user/login";
}
private boolean validateUser(BindingResult bindingResult
, HttpServletRequest request) {
boolean b = false;
if (bindingResult.hasErrors()) {
// 如果没有通过,跳转提示
List<FieldError> list = bindingResult.getFieldErrors();
for (FieldError error : list) {
String errorName = error.getField() + "Error";
String errorMessage = error.getDefaultMessage();
request.setAttribute(errorName, errorMessage);
}
b =true;
}
return b;
}
首先:需要在被验证的bean前面和后面加上@Validated(value = { validatedGroup1.class }) User user,BindingResult bindingResult,注意下BindingResult需要和被验证的bean在同一行不然有可能出错,然后说下@Validated(value = { validatedGroup1.class }) 中的value = { validatedGroup1.class }的作用,他的话可以将验证信息进行分组,简单介绍下:可以通过创建一个接口,然后在被验证的bean中的注解中写上想应的分组(看下第三步),Controller也需要进行@Validated(value = { validatedGroup1.class })配置,然后就可以将不同的验证进行分组,有多个分组的话就写出多个接口然后进行相应的配置。