业务规范之统一异常处理和统一响应
###业务规范之springboot整合swagger2
###业务规范之统一验证
###业务规范之统一返回体
###业务规范之统一异常处理和统一响应
四、统一异常处理
统一api异常:
public class APIException extends RuntimeException {
private int code;
private String message;
public APIException(int code, String message){
super(message);
this.code = code;
this.message = message;
}
public APIException(String message){
this(ResultEnum.FAILED.getCode(),message);
}
public APIException(){
this(ResultEnum.FAILED.getCode(),ResultEnum.FAILED.getMessage());
}
}
统一异常处理:
@RestControllerAdvice
public class ExceptionControllerAdvice {
/**
* 全局处理参数校验未通过异常
* @return
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ErrorResponse<String> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
ErrorResponse<String> errorResponse = new ErrorResponse<>();
// 获得默认消息
String defaultMessage = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
errorResponse.setFailed(ResultEnum.VALIDATE_FAILED.getCode(),
ResultEnum.VALIDATE_FAILED.getMessage()+": "+defaultMessage);
return errorResponse;
}
/**
* 全局处理api异常
* @param e
* @return
*/
@ExceptionHandler(value = APIException.class)
public ErrorResponse<String> apiExceptionHandler(APIException e){
ErrorResponse<String> errorResponse = new ErrorResponse<>();
errorResponse.setFailed(ResultEnum.FAILED.getMessage()+e.getMessage());
return errorResponse;
}
/**
* 全局处理exception
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public ErrorResponse<String> exceptionHandler(Exception e){
ErrorResponse<String> errorResponse = new ErrorResponse<>();
errorResponse.setFailed(ResultEnum.ERROR.getCode(),ResultEnum.ERROR.getMessage());
return errorResponse;
}
}
五、统一响应
统一响应体:
@RestControllerAdvice
public class ResponseControllerAdvice implements ResponseBodyAdvice<Object> {
/**
* 全局处理响应数据
*/
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
// 当返回的数据不是BaseResponse 的时候,执行 beforeBodyWrite 方法
// ① 获得返回参数类型
System.out.println(methodParameter);
Type genericParameterType = methodParameter.getGenericParameterType();
String typeName = genericParameterType.getTypeName();
String name = "org.springframework.http.ResponseEntity";
// 对swagger的请求不做处理
if (typeName.contains(name)) {
return false;
}
String typeName2 = ErrorResponse.class.getTypeName();
// 对错误的返回请求不做处理
if (StrUtil.containsAny(typeName, typeName2)){
return false;
}
// 若是错误的则直接返回
return ! StrUtil.containsAny(typeName, BaseResponse.class.getTypeName());
}
/*
只有 supports 方法返回 true的时候才会执行以下方法
*/
@Override
public Object beforeBodyWrite(Object data, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
/**
* 这里只对正确的做处理
*/
BaseResponse<Object> baseResponse = new BaseResponse<>();
baseResponse.data =data;
if(methodParameter.getGenericParameterType().equals(String.class)){
ObjectMapper objectmapper = new ObjectMapper();
try {
return objectmapper.writeValueAsString(baseResponse);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new APIException("返回String类型错误");
}
}
return baseResponse;
}
}