1.背景
目前微服务开发越来越多,接口之间的交互也越多。考虑到一些异常情况,接口需要对异常进行统一处理,规范异常处理的行为。
2.实现方式
通过@RestControllerAdvice,对Restful接口异常进行统一处理,以下是一个简单的实例。
@RestControllerAdvice
@Slf4j
public class GlobalExceptionTranslator {
@ExceptionHandler(MethodArgumentNotValidException.class)
public BaseResponsehandleError(MethodArgumentNotValidException e){
log.warn("Method Argument Not Valid", e);
return BaseResponse
.builder()
.resultCode(ErrorCode.ERROR_PARAM_NOT_VALID.getErrorCode())
.message(ErrorCode.ERROR_PARAM_NOT_VALID.getMessage())
.build();
}
@ExceptionHandler(MissingServletRequestParameterException.class)
public BaseResponsehandleError(MissingServletRequestParameterException e){
log.warn("Param Miss", e);
return BaseResponse
.builder()
.resultCode(ErrorCode.ERROR_PARAM_MISS.getErrorCode())
.message(ErrorCode.ERROR_PARAM_MISS.getMessage())
.build();
}
@ExceptionHandler(Throwable.class)
public BaseResponsehandlerError(Throwable e){
log.error("Unknown Error", e);
return BaseResponse
.builder()
.resultCode(ErrorCode.ERROR_UNKNOWN.getErrorCode())
.message(ErrorCode.ERROR_UNKNOWN.getMessage())
.build();
}
}
异常错误信息,也可以在封装到一个类进行统一处理,当然最好是实现多语言。
public enum ErrorCode {
OK(0, "success"),
ERROR_PARAM_NOT_VALID(1, "Method Argument Not Valid"),
ERROR_PARAM_MISS(2, "Method Argument Miss"),
ERROR_UNKNOWN(9999, "Unknown Error");
private int errorCode;
private Stringmessage;
ErrorCode(int errorCode, String message) {
this.errorCode = errorCode;
this.message = message;
}
public int getErrorCode() {
return errorCode;
}
public StringgetMessage() {
return message;
}
}
这样,在RestController中,可以直接抛出异常,由统一异常处理类进行处理,返回统一的格式的结果。
网友评论