Hibernate Validation验证

一、前言

Hibernate Validation是一个后端验证框架,目前比较流行的验证做法:前端jquery-form-validate + 后端hibernate-validate,提到Hibernate Validator就不得不提JSR 303-Bean Validation规范,JSR-303 是Java EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator,此实现与Hibernate ORM 没有任何关系,JSR 303 用于对Java Bean 中的字段的值进行验证,提供了JSR 303规范中所有内置constraint的实现,除此之外还有一些附加的constraint。

二、hibernate Validation constraint 注解

2.1、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=) 被注释的元素必须符合指定的正则表达式

2.2、Hibernate Validator 附加的constraint
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
hibernate补充的注解中,最后3个不常用,可忽略。
主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别:
@NotNull 任何对象的value不能为null
@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null
@NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0

三、使用

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

A)配置validator

首先要在Spring的配置文件中进行配置,有以下几种方式:

1.在spring3之后,任何支持JSR303的validator(如Hibernate Validator)都可以通过简单配置引入,只需要在配置xml中加入,这时validatemessage的属性文件默认为classpath下的ValidationMessages.properties:

<!-- support JSR303 annotation if JSR 303 validation present on classpath -->
<mvc:annotation-driven />

2.如果不使用默认,可以使用下面配置:

<mvc:annotation-driven validator="validator" />
 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="providerClass"  value="org.hibernate.validator.HibernateValidator"/>
    <!--不设置则默认为classpath下的ValidationMessages.properties -->
    <property name="validationMessageSource" ref="validatemessageSource"/>
</bean>
<bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
    <property name="basename" value="classpath:validatemessages"/>  
    <property name="fileEncodings" value="utf-8"/>  
    <property name="cacheSeconds" value="120"/>  
</bean> 

配置validator验证规则

package com.fendo.pays.request;
 
import java.util.Date;
 
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
 
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;
 
/**   
 * @Title: UserRequest.java 
 * @Package com.fendo.pays.request 
 * @Description: 用户请求参数
 * @author fendo
 * @date 2017年10月2日 下午11:36:17 
 * @version V1.0   
*/
public class UserRequest {
 
	private String id;  //唯一标识
	
	
	@Size(min=1,max=30,message="{user.name.length.error}")
	private String name;  //姓名
	
	@NotBlank(message="{user.password.isNull}")
	@Pattern(regexp="^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,10}$", message="{user.password.error}")
	private String password; //密码
	
	private String idcard; //银行卡号
	
	@NotBlank(message="{user.email.isNull}")
	@Email(message="{user.email.error}")
	private String email;  //邮箱
	
	@NotEmpty(message="{user.addres.isNull}")
	private String addres;  //地址
	
	@Pattern(regexp="^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$", message="{user.mobile.error}")
	private String mobile; //手机号
	
	
	@NotNull(message="{user.highbloodpressure.isNull}")
	@Min(value=1,message="{user.highbloodpressure.error}")
	private Double highbloodpressure;  //血压高
	
	@NotNull(message="{user.Lowbloodpressure.isNull}")
	@Min(value=1,message="{user.Lowbloodpressure.error}")
	private Double Lowbloodpressure; //血压低
	
	
	private Integer idcardnum; //银行卡数
	
	@DateTimeFormat(pattern="yyyy-MM-dd")
	@NotNull(message="{user.createtime.isNull}")
	private Date createtime;//创建日期
	
	.........
}

在Resource目录下新建ValidationMessages.properties配置文件,内容为:

#配置错误提示信息
user.name.length.error=请输入130个字符的商品名称
user.createtime.isNull=请输入商品的生产日期
user.email.error=请输入正确的邮箱
user.email.isNull=邮箱不能为空
user.mobile.error=请输入正确的手机号
user.password.isNull=请输入密码
user.password.error=密码必须是6~10位数字和字母的组合
user.highbloodpressure.isNull=血压高不能为空
user.highbloodpressure.error=血压高的值最低为1
user.Lowbloodpressure.isNull=血压低不能为空
user.Lowbloodpressure.error=血压高的值最低为1
user.addres.isNull=地址不能为空

在实体类中直接使用{user.createtime.isNull}方法就能获取得到。。
C)使用validator

在Spring中使用validator有以下几种方式:

1.在需要校验的对象前增加@Valid 注解(该注解位于javax.validation包中)来触发校验。这样就可以完成针对输入数据User对象的校验了,校验结果任然保存在BindingResult对象中。

@RequestMapping(value = "/addusers", method = RequestMethod.GET)
@ResponseBody
public SimpleResult AddUsers(@Valid UserRequest userrequest,BindingResult bindingResult) throws Exception {
       SimpleResult simpleResult=SimpleResult.success();
       LOGGER.info("[/user/addusers]");
		 
       //获取校验错误信息
	if(bindingResult.hasErrors()) {
	     // 输出错误信息
	     List<FieldError> allErrors = bindingResult.getFieldErrors();
	     for (FieldError objectError : allErrors) {
		System.out.println(objectError.getDefaultMessage());
		// 将错误信息传到页面
		//simpleResult.put(objectError.getField(), objectError.getDefaultMessage());
	        return simpleResult.error(SimpleCode.ERROR.getCode(), objectError.getDefaultMessage());
	      }
	}
	System.out.println(userrequest.toString());
         //使用日起转换器工具类
         ConvertUtils.register(new DateLocaleConverter(), Date.class);   //不灵活,自己实现最好
		 UserEntity userEntity=new UserEntity();
		 BeanUtils.copyProperties(userrequest, userEntity);
		 userEntity.setId(UUIDTool.getUUID());
		 userService.insertUser(userEntity);
		 return simpleResult;
		 
	 }

或者是使用@Validated注解,都差不多:

@RequestMapping(value = "/adduser", method = RequestMethod.GET)
@ResponseBody
@SystemControllerLog(modelName="UserController",option="AddUser",description = "新增用户") 
public SimpleResult AddUser(Model model,@Validated UserRequest userrequest,BindingResult  bindingResult) throws Exception {
	 SimpleResult simpleResult=SimpleResult.success();
 
	 LOGGER.info("[/user/adduser]");
	 
	 //获取校验错误信息
	 if(bindingResult.hasErrors()) {
		// 输出错误信息
		List<FieldError> allErrors = bindingResult.getFieldErrors();
		for (FieldError objectError : allErrors) {
			System.out.println(objectError.getDefaultMessage());
			// 将错误信息传到页面
			//simpleResult.put(objectError.getField(), objectError.getDefaultMessage());
			 return simpleResult.error(SimpleCode.ERROR.getCode(), objectError.getDefaultMessage());
 
		}
	 }
	 System.out.println(userrequest.toString());
 
		 //使用日起转换器工具类
	 ConvertUtils.register(new DateLocaleConverter(), Date.class);   //不灵活,自己实现最好
 
	 UserEntity userEntity=new UserEntity();
	 BeanUtils.copyProperties(userrequest, userEntity);
	 userEntity.setId(UUIDTool.getUUID());
	 userService.insertUser(userEntity);
	 return simpleResult;
 
}

2.通过Spring注入validator来验证:

@Autowired
private Validator validator;
 
 
@RequestMapping(value = "/adduseres", method = RequestMethod.GET)
@ResponseBody
@SystemControllerLog(modelName="UserController",option="AddUser",description = "新增用户") 
public SimpleResult AddUseres(UserRequest userrequest) throws Exception {
	 SimpleResult simpleResult=SimpleResult.success();
	 LOGGER.info("[/user/adduseres]");
	 
	 if(validates(validator, userrequest)!=null){
		 return simpleResult.error(SimpleCode.ERROR.getCode(), validates(validator, userrequest));
	 }
	 System.out.println(userrequest.toString());
	 //使用日起转换器工具类
	 //ConvertUtils.register(new DateLocaleConverter(), Date.class);   //不灵活,自己实现最好
	 UserEntity userEntity=new UserEntity();
	 //BeanUtils.copyProperties(userrequest, userEntity);
	 BeanUtilsExs.copyProperties(userrequest, userEntity);
	 userEntity.setId(UUIDTool.getUUID());
	 userService.insertUser(userEntity);
	 return simpleResult;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值