目录
2.1.2 方式二:下载hibernate-validator-5.2.2.Final.jar包放到项目里并引入
3.2.1 Bean Validation 中内置的 constraint
3.2.2 Hibernate Validator 附加的 constraint
第四章 hibernate-validator自定义注解校验
5.1 定义两个空接口,分别代表Person对象的增加校验规则和修改校验规则
第一章 当前要解决的问题
最近在项目中,后端人员遇到了一个共同的问题,就是测试提出的大量的后端参数验证的问题。最容易想到的解决方案是用简单的if判断参数是否满足条件,比如参数不能为null,email必须符合email的格式。 如果参数较少,这种方式还可以接受,但是如果需要校验的参数较多,手动进行if判断或者写正则表达式判断开发效率太慢,在时间、成本、质量的博弈中必然会落后。所以把校验层抽象出来是必然的。
Java程序开发中,当你要处理一个程序的业务逻辑时,请求参数的数据校验是必须要处理的。当请求参数格式不正确的时候,需要程序监测到,并且返回对应的错误提示,以此来达到数据校验的目的。对于前后端分离开发过程中,数据校验还需要返回对应的状态码和错误提示信息。在盐城信访项目中,我们理想的错误提示信息返回情况类似下图:
图1.1
笔者在被后台参数验证问题困扰了一段时间后,终于决定找出一个更加可行的方案,既不影响代码的可读性,更加方便快捷高效,那就是hibernate-validator。
第二章 hibernate-validator简介
hibernate-validator是Hibernate项目中的一个数据校验框架,是Bean Validation 的参考实现,hibernate-validator除了提供了JSR 349规范中所有内置constraint 的实现,还有一些附加的constraint 。使用hibernate-validator能够将数据校验从业务代码中脱离出来,增加代码可读性,同时也让数据校验变得更加方便、简单。
2.1 添加jar包
要使用hibernate-validator进行参数校验,首先要引入hibernate-validator的jar包。
2.1.1 方式一:添加Maven依赖支持
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.2.Final</version>
</dependency>
2.1.2 方式二:下载hibernate-validator-5.2.2.Final.jar包放到项目里并引入
本项目中使用的就是第二种方式。
图2.1
当然不管哪种方式,jar包的版本不仅限于5.2.2,可以根据实际情况选择jar包版本。
2.2 配置文件
在spring-mvc.xml文件中要有如下片段:
图2.2
第三章 hibernate-validator默认注解校验
在引入了hibernate-validator的jar包后,就可以使用hibernate-validator对后端参数进行校验了。
3.1在ExceptionHandlerAdvice中添加如下方法
图3.1
为了捕获默认注解校验失败抛出的异常,并按照RetJson格式返回错误信息,在ExceptionHandlerAdvice中添加
@ExceptionHandler(BindException.class),
@ExceptionHandler(ConstraintViolationException.class),
@ExceptionHandler({MissingServletRequestParameterException.class})代码。
//实体类上的异常捕获
@ExceptionHandler(BindException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public RetJson illegalStateException(BindException e) {
return RetJson.error(validation(e.getBindingResult()));
}
private String validation(BindingResult bindingResult) {
List<ObjectError> errors = bindingResult.getAllErrors();
StringBuilder sb = new StringBuilder("");
if (!CollectionUtils.isEmpty(errors)) {
for (ObjectError error : errors) {
FieldError fieldError = (FieldError) error;
sb.append(fieldError.getDefaultMessage() + ",");
}
}
return sb.length()>0?sb.substring(0,sb.length()-1):"请求参数不合法";
}
//Controller层参数上的异常捕获
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public RetJson handleValidationException(ConstraintViolationException e){
StringBuilder sb = new StringBuilder("");
for(ConstraintViolation<?> s:e.getConstraintViolations()){
sb.append(s.getMessage() + ",");
}
return RetJson.error(sb.length()>0?sb.substring(0,sb.length()-1):"请求参数不合法");
}
//required=true不满足时的异常捕获
//缺少参数异常
//getParameterName() 缺少的参数名称
@ExceptionHandler({MissingServletRequestParameterException.class})
@ResponseBody
public RetJson requestMissingServletRequest(MissingServletRequestParameterException ex){
//ex.printStackTrace();
return RetJson.error("缺少必要参数,参数名称为" + ex.getParameterName());
}
3.2 默认的注解
hibernate Validator 是 Bean Validation 的参考实现 。Hibernate Validator 提供了 JSR 349 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
在日常开发中,Hibernate Validator经常用来验证bean的字段,基于注解,方便快捷高效。