type
Post
status
Published
date
Dec 2, 2021
slug
summary
BO 结合 hibernate 注解来对接口入参进行统一封装校验
tags
项目方案
category
技术分享
icon
password

介绍

依赖

<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.2.Final</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>

常用注解

注解
说明
@Valid
需要验证
@NotNull
非空
@Max(value)
最大值
@Size(max,min)
字符串长度范围
  • @Valid 加在参数列表的某个参数类前,其他注解才会生效
  • 其他注解都写在入参类的属性上
  • 注解有各自特定属性
    • message: 校验不满足时的提示信息
    • min/max

处理校验结果

BindingResult

校验结果封装在了 BindingResult 对象中,可以在接口的参数列表中接收这个参数
封装一个 getErrors 方法对绑定结果进行处理
private Map<String, String> getErrors(BindingResult result) { Map<String, String> map = new HashMap<>(); List<FieldError> errorList = result.getFieldErrors(); for (FieldError ff : errorList) { // 错误所对应的属性字段名 String field = ff.getField(); // 错误的信息 String msg = ff.getDefaultMessage(); map.put(field, msg); } return map; }
在接口方法中,调用这个方法判断结果集中是否保存了错误的验证信息,如果有则返回到前端
if( result.hasErrors() ) { Map<String, String> map = getErrors(result); return GraceJSONResult.errorMap(map); }
这种方式的缺点是对代码有侵入性 (接口方法中多了和业务无关的参数和校验方法) 并且后续微服务升级时,接口调用会出现问题

统一封装拦截

在统一异常拦截类中配置 ExceptionHandler
拦截 MethodArgumentNotValidException 异常类型
@ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public ApiCommonResponse handleArgNotValidException (MethodArgumentNotValidException e){ BindingResult result = e.getBindingResult(); Map<String, String> map = getErrors(result); return GraceJSONResult.errorMap(map); } /** * 将异常结果信息绑定到统一响应对象对外暴露 * @param result 异常对象绑定的结果 * @return */ public Map<String, String> getErrors(BindingResult result) { Map<String, String> map = new HashMap<>(); List<FieldError> errorList = result.getFieldErrors(); for (FieldError ff : errorList) { // 错误所对应的属性字段名 String field = ff.getField(); // 错误的信息 String msg = ff.getDefaultMessage(); map.put(field, msg); } return map; }
Redis/Bitmap类型使用及原理API 统一返回对象的两种定义方式