@Slf4j
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
private final static String MethodArgumentNotValidExceptionCode = "10001";//vo字段验证异常
//自定义的报错
@SneakyThrows
@ExceptionHandler(value = BaseException.class)
public ResponseEntity<String> baseException(BaseException e, HttpServletRequest request) {
return getException(e, e.getErrorCode(), e.getErrorMsg(), request);
}
//字段验证报错
@SneakyThrows
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> baseException(MethodArgumentNotValidException e, HttpServletRequest request, HttpServletResponse response) {
return getException(e, MethodArgumentNotValidExceptionCode, Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage(), request);
}
//返回错误的统一格式
@SneakyThrows
public ResponseEntity<String> getException(Exception e, String code, String msg, HttpServletRequest request) {
log.error("PATH:" + request.getServletPath() + ",code:" + code + ",mgs:" + msg + "\n" + getStackTrace(e));
ResponseData.Builder<String> builder = ResponseData.builder();
builder.error(code);
builder.msg(msg);
ObjectMapper objectMapper = new ObjectMapper();
String body = objectMapper.writeValueAsString(builder.build());
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("Content-Type", "application/json;charset=UTF-8");
return ResponseEntity.ok().headers(responseHeaders).body(body);
}
//返回抛错的过程
public static String getStackTrace(final Throwable throwable) {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw, true);
throwable.printStackTrace(pw);
return sw.getBuffer().toString();
}
}
主要是为了和返回的数据统一格式。判断code是否正常返回。
错误返回格式:
正常返回格式: