BusinessException 是产品业务层面错误处理的通用异常类,是一个非受检异常。 BusinessException 与系统默认异常最大的不同之处就是包含了一个 errorCode 属性。在业务中出错的地方,抛出一个携带有特定错误码的 BusinessException 异常,然后全局处理该异常类型,从其中解析构造出我们想要的错误消息,由 Spring 直接返回出去,即为一个符合我们要求的错误消息。
CustomizedBaseExceptionHandler 继承自 org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler,从名称上也可以看出来, ResponseEntityExceptionHandler 是一个用于全局处理 RESTful 接口异常的处理器。通过在该类型及其子类型中添加使用 @ExceptionHandler 注解的方法,可以处理指定异常类型。
ErrorDetails 自定义的错误消息体,可以根据自己的实际需要随意定制。
业务模块
业务模块中,其他部分可以从略,我们关注这么几个类:
BookStoreErrorCode 类是我们定义的与该业务子模块息息相关的错误码,举几个例子
/**
* 虽然不推荐,但允许在模块中自定义新的错误码,而不去使用通用库中已经定义的 {@link CommonErrorCode#NOT_FOUND} 错误码
*/
NOT_FOUND_BOOK("NotFoundBook", "Book {0} not found."),
/**
* 有如下两种定义错误码的思路:
* 1. 定义宽泛的错误码,传入参数,如 Exists,传入 Book[id=1]
* 2. 定义特定的错误码,如 InvalidBookId.Exists,不用传入参数
*
* 具体采用哪种,可以根据喜好来决定,个人更偏向于定义相对宽泛的错误码,上面的 {@link #NOT_FOUND_BOOK} 示例也类似
*/
EXISTS("Exists", "The specified object {0} already exists."),
INVALID_BOOK_ID_EXISTS("InvalidBookId.Exists", "The specified bookId already exists.");
BookStoreErrorCode(String code, String message) {
this.code = code;
this.message = message;
}
/**
* Customized error code
*/
private String code;
/**
* Error message details
*/
private String message;
@Override
public String getCode() {
return "BookStore." + code;
}
@Override
public String getMessage() {
return message;
}
很容易发现它与 CommonErrorCode 中定义的通用错误码的不同之处,那就是更偏向于具体业务了。此外还需要注意 getCode