SpringMvc统一异常处理以及统一返回数据格式

1、定义统一返回数据格式:

public class CommonResponse<T> {

    private String status;

    private String message;

    private T data;

    public CommonResponse() {
    }

    public CommonResponse(String status, String message) {
        this.status = status;
        this.message = message;
    }

    public String getStatus() {
        return status;
    }

    public CommonResponse<T> setStatus(String status) {
        this.status = status;
        return this;
    }

    public String getMessage() {
        return message;
    }

    public CommonResponse<T> setMessage(String message) {
        this.message = message;
        return this;
    }

    public T getData() {
        return data;
    }

    public CommonResponse<T> setData(T data) {
        this.data = data;
        return this;
    }

    public static CommonResponse successResponse(Object data){
        CommonResponse response = new CommonResponse<>();
        response.setData(data);
        return response;
    }

2、统一异常处理:

这里我们使用@ControllerAdvice注解来实现,用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中,即Controller的切面。

@ExceptionHandler 用于发生异常时进行处理。

@ControllerAdvice
public class CommonExceptionHanlder {

    @ExceptionHandler(Exception.class)    //对那些异常进行处理
    @ResponseBody                         //定义返回类型,
    public CommonResponse response(Exception e){
        if(e instanceof UnauthenticatedException){
            //这里可以添加日志
            return new CommonResponse("501","用户未登录");  
            
        }
        if(e instanceof UnauthorizedException){
            return new CommonResponse("502","暂无访问权限");
        }
        else{
            return new CommonResponse("500","系统错误");
        }
    }
}

这样就避免了直接返回错误信息给用户。

3、统一返回格式:

ResponseBodyAdvice是spring4.1的新特性,其作用是在响应体写出之前做一些处理;比如,修改返回值、加密等。

RequestBodyAdvice 则可以在Body进行解析前进行的一些处理,例如解密

这里我们使用的是ResponseBodyAdvice,在响应体写出之前对数据进行数据的封装。

@ControllerAdvice
//需要继承ResponseBodyAdvice,重写方法
public class ResponseAdvice implements ResponseBodyAdvice {
    //这个方法用来判断是否要执行beforeBodyWrite方法。
    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
         //在实际项目中可以添加注解来判断哪些需要进行数据的修改
         return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        //返回封装的数据
        return CommonResponse.successResponse(o);
    }

猜你喜欢

转载自blog.csdn.net/qq_39158142/article/details/82999268