导航
导航

Controller层最佳实践之统一异常处理

Controller层最佳实践:
统一的请求响应体(包含成功与失败返回提醒)
统一的请求数据效验(采用Hibernate Validation)
统一的接口异常捕获 (使用controllerAdvice实现的全局异常处理)

springboot可以使用@RestControllerAdvice组合注解

/**
* @Description: 统一异常处理器
* @Author:
* @Date:
*/
@RestControllerAdvice
public class ExceptionControllerAdvice {

//不同的异常特殊处理
}

/**
* 自定义异常
* @param e
* @return
*/
@ExceptionHandler(ServerDefinedException.class)
private Resp serverDefinedExceptionHandler(ServerDefinedException e) {
logger.info("服务异常", e);
return Resp.badRequest(e.getMessage());
}


1、对于有@RequestBody的json数据入参校验失败的异常为MethodArgumentNotValidException
获取异常信息

MethodArgumentNotValidException e;

Map<String, String> message = Maps.newHashMap();
for (FieldError error : e.getBindingResult().getFieldErrors()) {
message.put(error.getField(),error.getDefaultMessage());
}

2、普通的表单形式提交校验失败的异常为BindException 获取方法同上

3、对于参数的校验,需加入注解校验,然后在Controller方法上加入@Validated注解,校验不通过的异常为ConstraintViolationException
获取异常信息

ConstraintViolationException e;

Map<String, String> message = Maps.newHashMap();
e.getConstraintViolations().forEach(violation -> message.put(violation.getPropertyPath().toString().substring(violation.getPropertyPath().toString().lastIndexOf('.') + 1), violation.getMessage()));
map.put("message", "参数存在异常");
map.put("body", message);