package com.test.commons.exception;
import com.alibaba.fastjson.JSONObject;
import com.epro.commons.response.ArgumentCode;
import com.epro.commons.response.ResponseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.*;
/**
* @author
* @description: TODO
* @date 2021/11/3 10:43
*/
@RestControllerAdvice
@Slf4j
public class RestExceptionHandler {
/**
* 处理Get请求的验证异常
*
* @param result
* @return com.flyduck.cms.vo.ApiResult
*/
@ExceptionHandler(BindException.class)
public ResponseResult bindExceptionHandle(BindingResult result) {
if (result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
/* List<String> list = new ArrayList<>();
errors.forEach(p ->{
FieldError fieldError = (FieldError) p;
list.add(fieldError.getDefaultMessage());
});*/
HashSet<ObjectError> set = new HashSet<>(errors);
if (!errors.isEmpty() && !StringUtils.isEmpty(set.iterator().next().getDefaultMessage())) {
return new ResponseResult(false, ArgumentCode.PARAMS_ERROR.getCode(), set.iterator().next().getDefaultMessage(), null);
}
}
return new ResponseResult(ArgumentCode.PARAMS_ERROR);
}
/**
* 处理Post请求的验证异常
*
* @param exception
* @return com.flyduck.cms.vo.ApiResult
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseResult methodArgumentNotValidHandler(MethodArgumentNotValidException exception) {
BindingResult result = exception.getBindingResult();
if (result != null && result.hasErrors()) {
List<ObjectError> errors = result.getAllErrors();
Set<ObjectError> set=new HashSet<>(errors);
//ArrayList<ObjectError> objectErrors = new ArrayList<>(set);
// 出现参数校验异常时,只需抛出第一条即可
FieldError fieldError = (FieldError) set.iterator().next();
if (!errors.isEmpty() && !StringUtils.isEmpty(fieldError.getDefaultMessage())) {
int errorCode = ArgumentCode.PARAMS_ERROR.getCode();
String msg = fieldError.getDefaultMessage();
return new ResponseResult(false, errorCode, msg, null);
}
}
return new ResponseResult(ArgumentCode.PARAMS_ERROR);
}
/**
* 处理请求参数格式的验证异常
*
* @param exception
* @return com.flyduck.cms.vo.ApiResult
*/
@ExceptionHandler(ConstraintViolationException.class)
public ResponseResult constraintViolationHandler(ConstraintViolationException exception) {
Set<ConstraintViolation<?>> violations = exception.getConstraintViolations();
if (violations.size() > 0) {
List<String> list = new ArrayList<>();
for (ConstraintViolation<?> violation : violations) {
list.add(violation.getMessage());
}
if (!list.isEmpty()) {
return new ResponseResult(false, ArgumentCode.PARAMS_ERROR.getCode(), list.get(0), null);
}
}
return new ResponseResult(ArgumentCode.PARAMS_ERROR);
}
@ExceptionHandler(CustomException.class)
public ResponseResult exception(Exception e) {
log.error("---------------------error:{}-------------------------", e.getMessage());
Map map = JSONObject.parseObject(e.getMessage(), Map.class);
return ResponseResult.create().msg((Integer) map.get("code"), (String) map.get("msg")).success((Boolean) map.get("success"));
}
}
全局异常捕获工具类
于 2022-08-24 14:37:42 首次发布
该博客主要介绍了如何在Spring Boot应用中处理不同类型的验证异常,包括BindException、MethodArgumentNotValidException和ConstraintViolationException。通过@RestControllerAdvice和@ExceptionHandler注解实现全局异常处理,返回统一的错误响应。此外,还展示了如何处理字段级别的错误信息,提供详细的错误消息给客户端。
1万+

被折叠的 条评论
为什么被折叠?



