自定义全局异常和返回封装

自定义全局异常和返回封装

自定义返回实体

package com.lwp.util;

import lombok.Data;

/**
 * @author: liuwenpu
 * @date: 2021/10/2514:55
 * @description: 统一返回类
 */
@Data
public class ResultData<T> {
    private int code;
    private String msg;
    private T data;
    private long timestamp;

    public ResultData(){
        this.timestamp = System.currentTimeMillis();
    }

    public static <T> ResultData<T> success(T data){
        ResultData rd = new ResultData();
        rd.setCode(200);
        rd.setMsg("操作成功!");
        rd.setData(data);
        return rd;
    }

    public static <T> ResultData<T> error(T data){
        ResultData rd = new ResultData();
        rd.setCode(500);
        rd.setMsg("操作异常!");
        return rd;
    }
}

返回封装

package com.lwp.advice;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.lwp.util.ResultData;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * @author: liuwenpu
 * @date: 2021/10/2515:01
 * @description:  返回对象预处理类
 */
@Slf4j
@RestControllerAdvice //全局异常、全局数据绑定、全局数据预处理注解
public class ResponseAdvice implements ResponseBodyAdvice<Object> {

    /**
     * 是否给指定的控制器方法返回类型,true的话执行beforeBodyWrite方法
     * @param methodParameter
     * @param aClass
     * @return
     */
    @Override
    public boolean supports(MethodParameter methodParameter, Class aClass) {
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if(o instanceof ResultData){
            log.info("直接返回:{}",o);
            return o;
        }
        ObjectMapper om = new ObjectMapper();
        log.info("类型加装:{}",o);
        return om.writeValueAsString(ResultData.success(o));
    }
}

全局异常处理

package com.lwp.advice;

import com.lwp.util.ResultData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @author: liuwenpu
 * @date: 2021/10/2515:18
 * @description: 全局异常处理类
 */
@Slf4j
@RestControllerAdvice //全局异常、全局数据绑定、全局数据预处理注解
public class RestExceptionHandler {

    /**
     * 统一处理某一类异常,多个以逗号隔开,拦截自定义异常则放入自定义类
     * @param e
     * @return
     */
    @ExceptionHandler({Exception.class})
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)  //客户端接收到的状态码
    public ResultData exception(Exception e){
        log.error("全局异常信息,ex={}",e.getMessage(),e);
        return ResultData.error(e.getMessage());
    }
}
posted @ 2021-10-25 23:14  幸运刘  阅读(103)  评论(0)    收藏  举报