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>
B)配置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=请输入1到30个字符的商品名称
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;
————————————————
版权声明:本文为CSDN博主「lfendo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011781521/article/details/72510328