@ControllerAdvice(assignableTypes = {BaseController.class})
@ResponseBody
public class GlobalExceptionAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionAspect.class);
private Map<String, String> getErrorMesg(BindingResult bindingResult) {
Map<String, String> validResult = Maps.newHashMap();
List<FieldError> errors = bindingResult.getFieldErrors();
errors.forEach(item -> {
validResult.put(item.getField(), item.getDefaultMessage());
});
return validResult;
}
/*
* 400-Bad Request
*/
//@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(value = { MethodArgumentNotValidException.class,
BindException.class,
MissingServletRequestParameterException.class,
TypeMismatchException.class })
public @ResponseBody WebResultDTO handleValidException(
Exception e) {
WebResultDTO result = new WebResultDTO();
if (e instanceof MethodArgumentNotValidException) {
BindingResult bindingResult = ((MethodArgumentNotValidException)e).getBindingResult();
if (bindingResult.hasErrors()) {
result.setValidResult(getErrorMesg(bindingResult));
}
} else if (e instanceof BindException) {
BindingResult bindingResult = ((BindException)e).getBindingResult();
if (bindingResult.hasErrors()) {
result.setValidResult(getErrorMesg(bindingResult));
}
} else if (e instanceof MissingServletRequestParameterException) {
Map<String,String> validResult = new HashMap<>();
validResult.put(((MissingServletRequestParameterException)e).getParameterName(),"缺少参数");
result.setValidResult(validResult);
} else if (e instanceof TypeMismatchException) {
Map<String,String> validResult = new HashMap<>();
if(e instanceof MethodArgumentTypeMismatchException){
validResult.put(((MethodArgumentTypeMismatchException)e).getName(),"参数类型不匹配,应为"+((TypeMismatchException)e).getRequiredType());
}else{
validResult.put(((TypeMismatchException)e).getMessage(),"参数类型不匹配,应为"+((TypeMismatchException)e).getRequiredType());
}
result.setValidResult(validResult);
}
result.setData(false);
result.setStatus(HttpStatusCode.BAD_REQUEST);
result.setMsg("参数错误");
LOGGER.error("参数错误 {} {}", result.getStatus(), result.getValidResult());
return result;
}
/*
* 503-Service Unavailable
*/
//@ResponseStatus(HttpStatus.SERVICE_UNAVAILABLE)
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(RpcException.class)
public @ResponseBody WebResultDTO handleRpcException(
RpcException e) {
WebResultDTO result = new WebResultDTO();
result.setStatus(HttpStatus.SERVICE_UNAVAILABLE.value());
result.setMsg("上游服务不可用");
LOGGER.error("上游服务不可用", e);
return result;
}
/**
* 500 - Internal Server Error
*/
//@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(Exception.class)
public @ResponseBody WebResultDTO handleException(Exception e) {
WebResultDTO result = new WebResultDTO();
Map<String,String> validResult = new HashMap<>();
validResult.put(e.getClass().getSimpleName(),e.getMessage());
result.setValidResult(validResult);
result.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
result.setMsg("未知错误,请联系管理员");
LOGGER.error("未知错误", e);
return result;
}
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(BusinessException.class)
public @ResponseBody WebResultDTO handleBusinessException(BusinessException e) {
WebResultDTO result = new WebResultDTO();
result.setStatus(e.getCode());
result.setMsg(e.getMessage());
LOGGER.error("业务异常 {} {}", result.getStatus(), result.getMsg());
return result;
}
}
全局异常拦截(含自定义异常)
于 2020-08-13 11:12:14 首次发布