@Slf4j
@RestControllerAdvice
public class RestExceptionAdvice {
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public Result httpRequestMethodNotSuppertedException(HttpRequestMethodNotSupportedException ex, HttpServletResponse response, HttpServletRequest request) {
log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "httpRequestMethodNotSuppertedException"), ex);
response.setStatus(HttpStatus.NOT_FOUND.value());
return Result.error(HttpStatus.NOT_FOUND.value(), "请求路径错误或者请求方式错误(method)");
}
@ExceptionHandler(NoHandlerFoundException.class)
public Result noHandlerFoundException(NoHandlerFoundException ex, HttpServletRequest request , HttpServletResponse response) {
if(request.getMethod().equalsIgnoreCase(RequestMethod.OPTIONS.name())) {
response.setStatus(HttpStatus.OK.value());
return Result.ok();
}
log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "NoHandlerFoundException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
response.setStatus(HttpStatus.NOT_FOUND.value());
return Result.error(HttpStatus.NOT_FOUND.value(), ex.getLocalizedMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result methodArgumentNotValidException(MethodArgumentNotValidException ex, HttpServletResponse response, HttpServletRequest request) {
BindingResult bindingResult = ex.getBindingResult();
StringBuilder sbf = new StringBuilder();
List<ObjectError> errors = bindingResult.getAllErrors();
for(ObjectError error: errors) {
try {
Field field = error.getClass().getDeclaredField("field");
field.setAccessible(true);
sbf.append(field.get(error)).append(" ").append(error.getDefaultMessage()).append(";");
} catch (Exception e) {
e.printStackTrace();
}
}
log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "MethodArgumentNotValidException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
response.setStatus(HttpStatus.BAD_REQUEST.value());
return Result.error(HttpStatus.BAD_REQUEST.value(), sbf.toString());
}
@ExceptionHandler(NullPointerException.class)
public Result nullPointerException(Exception ex, HttpServletResponse response, HttpServletRequest request) {
log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION,"nullPointerException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
return Result.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
}
@ExceptionHandler(CommonMsgException.class)
public Result msgException(CommonMsgException ex, HttpServletResponse response, HttpServletRequest request) {
log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "commonMsgException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
return Result.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
}
@ExceptionHandler(AuthException.class)
public Result authException(AuthException ex, HttpServletResponse response, HttpServletRequest request) {
log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "AuthException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
response.setStatus(ex.getHttpStatus());
return Result.error(ex.getResultCode(), ex.getMessage());
}
@ExceptionHandler(HttpServerNotSupportException.class)
public Result tsdbException(HttpServerNotSupportException ex, HttpServletResponse response, HttpServletRequest request) {
log.error(LogMark.format(BusinessExceptionConstants.TSDB_EXCEPTION, "tsdbException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
response.setStatus(HttpStatus.CONFLICT.value());
return Result.error(HttpStatus.CONFLICT.value(), ex.getMessage());
}
@ExceptionHandler(Exception.class)
public Result unknownException(Exception ex, HttpServletResponse response, HttpServletRequest request) {
log.error(LogMark.format(BusinessExceptionConstants.REST_EXCEPTION, "unknownException request url:{},request method:{}"), request.getRequestURI(), request.getMethod(), ex);
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
return Result.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), ex.getMessage());
}
}
以上java类主要是实现rest接口全局异常的处理,若没有指定特定的异常,再接口调用发生的异常都会走unknownException这个方法,如果想指定特定异常特定处理,比如AuthException,示例代码如下:
@GetMapping("/test")
public Result getLatestData(TokenMessage tokenMessage) {
if (null == tokenMessage) {
throw new AuthException(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.value(), "invalid token");
}
}
而实现全局接口异常的步骤,首先是要在类上加上注解@RestControllerAdvice,然后在方法上加上注解@ExceptionHandler,如果该注解里加入的方法类为Exception,那么如果接口报错,且报的错为Exception的
子类,那报错处理统一会走这个方法。
ps:有不对的地方,欢迎指导