Spring Boot在内部通过集成hibernate-validation已经实现了JSR-349验证规范接口,在Spring Boot项目中只要直接使用就行了。
一般用在Controller中用于验证前端传来的参数。
验证分两种:对封装的Bean进行验证 或者 对方法简单参数的验证。
文章目录
validation与 springboot 结合
1. bean 中添加标签
部分代码:
标签需要加在属性上,@NotBlank 标签含义文章末尾有解释
2. Controller中开启验证
在Controller 中 请求参数上添加@Validated 标签开启验证
3. resource 下新建错误信息配置文件
在resource 目录下新建提示信息配置文件“ValidationMessages.properties“
注意:名字必须为“ValidationMessages.properties“ 因为SpringBoot自动读取classpath中的ValidationMessages.properties里的错误信息
ValidationMessages.properties 文件的编码为ASCII。数据类型为 key value 。key“user.name.notBlank“为第一步 bean的标签 大括号里面对应message的值
value 为提示信息 ,但是是ASCII 。(内容为“名字不能为空“)
4. 自定义异常处理器,捕获错误信息
当验证不通过时会抛异常出来,异常的message 就是 ValidationMessages.properties 中配置的提示信息。此处定义异常处理器。捕获异常信息(因为验证不通过的项可能是多个所以统一捕获处理),并抛给前端。(此处是前后端分离开发)
public void MethodArgumentNotValidException(Exception ex, HttpServletRequest request, HttpServletResponse response) {
logger.error( ":" + CommonUtil.getHttpClientInfo(request), ex);
MethodArgumentNotValidException c = (MethodArgumentNotValidException) ex;
List<ObjectError> errors =c.getBindingResult().getAllErrors();
StringBuffer errorMsg=new StringBuffer();
errors.stream().forEach(x -> errorMsg.append(x.getDefaultMessage()).append(";"));
pouplateExceptionResponse(response, HttpStatus.INTERNAL_SERVER_ERROR, errorMsg.toString());
}
private void pouplateExceptionResponse(HttpServletResponse response, HttpStatus errorCode, String errorMessage) {
try {
response.sendError(errorCode.value(), errorMessage);
} catch (IOException e) {
logger.error("failed to populate response error", e);
}
}
5. 附上部分标签含义
Bean Validation 中内置的 constraint
hibernate补充的注解中,最后3个不常用,可忽略。
主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别:
@NotNull 任何对象的value不能为null
@NotEmpty 集合对象的元素不为0,即集合不为空,也可以用于字符串不为null
@NotBlank 只能用于字符串不为null,并且字符串trim()以后length要大于0
hibernate注解详细:http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/
源码下载地址:https://gitee.com/zhmal/spring-boot-samples/tree/master/spring-boot-sample-validation