自定义全局异常和返回封装
自定义返回实体
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());
}
}