业务规范之统一异常处理和统一响应

业务规范之统一异常处理和统一响应

###业务规范之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;
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章