1、新建类MyResponseBody
添加@ControllerAdvice
注解,实现ResponseBodyAdvice
的接口,其中由于StringHttpMessageConverter
对返回为字符串的类型做特殊处理,会报异常,因此这里也应做特殊处理
package test.supcon.util;
import com.alibaba.fastjson.JSONObject;
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.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* @author: zhaoxu
* @date: 2021/4/20 21:59
*/
@ControllerAdvice
public class MyResponseBody implements ResponseBodyAdvice {
@Override
public Object beforeBodyWrite(Object body, MethodParameter arg1,
MediaType arg2, Class arg3, ServerHttpRequest arg4,
ServerHttpResponse arg5) {
JSONObject map = new JSONObject();
map.put("data", body);
map.put("code", 0);
map.put("msg", "success");
if(body instanceof String){
return map.toJSONString();
}
return map;
}
@Override
public boolean supports(MethodParameter arg0, Class arg1) {
return true;
}
}
2、统一异常处理
使用@ControllerAdvice
、@ExceptionHandler
注解
/**
* 统一异常处理器
* java中异常分类 Exception->(IOException & RuntimeException),详情请自行查阅文档
*/
@Slf4j
@ControllerAdvice
public class ExceptionAdviceHandler {
/**
* RuntimeException异常捕获并统一处理
*/
@ExceptionHandler(value = RuntimeException.class)
@ResponseBody
public ResponseJson handle(RuntimeException e) {
log.info("RuntimeException异常或其子类异常捕获:{}", e.getMessage());
if(e instanceof BusinessException){
BusinessException ex=(BusinessException)e;
log.error("{}:{}", ex.getClass(),ex.getMessage());
return ResponseJson.error(ex.getCode(), ex.getMessage());
}
// 如果其他类型的RuntimeException子类,可在此处罗列
// ……
return ResponseJson.error(ResponseEnum.SERVER_ERROR.getCode(), e.getMessage());
}
/**
* 顶级异常捕获并统一处理,当其他异常无法处理时候选择使用
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseJson handle(Exception e) {
log.error("系统内部服务异常:{}", e.getMessage());
return ResponseJson.error(ResponseEnum.SERVER_ERROR);
}
}