1、引入数据校验的依赖,用的是springboot的数据校验,如下所示:
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、新建一个全局异常类,包括获取参数校验异常、自定义异常、运行异常、未知异常、错误信息,代码如下:
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* springbootstarter自带的参数校验异常
* 返回第一个参数异常的信息
* @param e
* @return
*/
@ExceptionHandler(BindException.class)
public Result handleValidation(BindException e) {
log.error("数据校验出现问题");
return Result.failure(e.getBindingResult().getFieldErrors().get(0).getDefaultMessage());
}
/**
* javax参数校验异常
* @param e
* @return
*/
@ExceptionHandler(value= MethodArgumentNotValidException.class)
public Result handleVaildException(MethodArgumentNotValidException e){
BindingResult bindingResult = e.getBindingResult();
Map<String,String> errorMap = new HashMap<>();
bindingResult.getFieldErrors().forEach((fieldError)->{
errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
});
log.error("数据校验出现问题{},异常类型:{},异常数据:{}",e.getMessage(),e.getClass(),errorMap);
return Result.failure("参数校验失败"+errorMap);
}
/**
* 参数为单个参数或多个参数
* @param e
* @return
*/
@ExceptionHandler(value = ConstraintViolationException.class)
public Result handleConstraintViolationException(ConstraintViolationException e) {
// 从异常对象中拿到ObjectError对象
String errorMessage = e.getConstraintViolations()
.stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.toList()).get(0);
log.error("数据校验出现问题{},异常类型:{},异常数据:{}",e.getMessage(),e.getClass(),errorMessage);
return Result.failure("参数校验失败"+errorMessage);
}
/**
* 处理自定义异常
*/
@ExceptionHandler(RRException.class)
public Result handleRRException(RRException e){
StackTraceElement[] stackTrace = e.getStackTrace();
log.error("处理自定义异常:---> 异常类:{},异常方法:{},异常行号:{},异常信息:{}",stackTrace[0].getClassName(),stackTrace[0].getMethodName(),stackTrace[0].getLineNumber(),e.getMessage());
return Result.failure("网络繁忙,请稍后再试");
}
/**
* 处理运行时异常
* @param e
* @return
*/
@ExceptionHandler(value = RuntimeException.class)
public Result handler(RuntimeException e){
StackTraceElement[] stackTrace = e.getStackTrace();
log.error("运行时异常:---------{}",e.getMessage());
log.error("运行时异常定位信息:---> 异常类:{},异常方法:{},异常行号:{},异常信息:{}",stackTrace[0].getClassName(),stackTrace[0].getMethodName(),stackTrace[0].getLineNumber(),e.getMessage());
return Result.failure(e.getMessage());
}
/**
* 错误信息
* @param throwable
* @return
*/
@ExceptionHandler(value = Throwable.class)
public Result handleException(Throwable throwable){
log.error("错误异常-------{}",throwable);
return Result.failure();
}
/**
* 未知异常
* @param e
* @return
*/
@ExceptionHandler(Exception.class)
public Result handleException(Exception e){
log.error("未知异常信息-------{}",e.getMessage());
return Result.failure();
}
}
3、新建一个controller做一个单参数校验,代码如下:
@PostMapping("/createUser")
public Result createUser(@NotEmpty(message = "name不能为空") String name,
@Max(value = 100, message = "请输入数字") Integer age){
return Result.success();
}
4、发起请求,看返回的结果如下图所示:
5、分组校验,一般分为添加校验和修改校验,新建两个接口,代码分别如下:
public interface AddGroup extends Default {
}
public interface UpdateGroup extends Default {
}
6、实体类添加参数的校验,代码如下:
@TableId(type = IdType.ASSIGN_ID)
@NotNull(message = "ID不能为空",groups = {AddGroup.class})
private Long id;
@TableField("name")
@Size(message = "账号长度建议在5~15",min = 5,max = 15,groups = {AddGroup.class})
@NotBlank(message = "账号不能为空",groups ={AddGroup.class, UpdateGroup.class})
private String username;
@NotNull(message = "年龄不能为空",groups = {AddGroup.class,UpdateGroup.class})
private Integer age;
@NotBlank(message = "邮箱不能为空",groups = {AddGroup.class})
private String email;
7、在controller写方法进行测试,分别对不同的分组进行测试,代码如下:
/**
* AddGroup
* @param user
* @return
*/
@PostMapping("/addGroup")
public Result addGroup(@Validated(AddGroup.class) UserDAO user){
return Result.success();
}
/**
* UpdateGroup
* @param user
* @return
*/
@PostMapping("/updateGroup")
public Result updateGroup(@Validated(UpdateGroup.class) UserDAO user){
return Result.success();
}
/**
* error
* @param num
* @return
*/
@PostMapping("/error")
public Result error(int num){
int i = 1/num;
return Result.success();
}
8、测试结果展示:
addGroup测试结果:
updateGroup测试结果:
error测试结果:
项目异常捕捉打印: