- BizException
- ExceptionType
- ErrorResponse
- GlobalExcepitonHandler
🔧 对于异常, 我们一般需要处理的是 一些自定义的异常为了扩展性,我们一般需要定义一个异常对象(BizException, 以及一个自定义异常枚举类(ExceptionType这样我们就可以在可能报错的地方抛出异常
🔩 有了异常对象,我们就需要把异常信息反馈给用户, 所以需要一个异常信息返回对象ErrorResponse然后通过springboot的全局异常处理, 把异常信息返回, (一般springboot会有默认的异常处理页面以及异常处理信息, 但是我们不用他们的
1. BizException
🛑 BizException.java
public class BizException extends RuntimeException{
private final Integer code;
public Integer getCode() {
return code;
}
public BizException(ExceptionType exceptionType) {
super(exceptionType.getMessage());
this.code = exceptionType.getCode();
}
}
2. ExceptionType
🛑 ExceptionType.java
public enum ExceptionType {
// 自定义异常类型
// **************begin **************
INNER_ERROR(500, "系统内部错误"),
UNAUTHORIZED(401, "未登录"),
BAD_REQUEST(400, "请求错误"),
FORBIDDEN(403, "无权操作"),
NOT_FOUND(404, "未找到"),
USER_NAME_DUPLICATE(40001001, "用户名重复"),
USER_NOT_FOUND(40401002, "用户不存在");
// **************end **************
private final Integer code;
private final String message;
ExceptionType(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
3. ErrorResponse
🛑 ErrorResponse.java
@Data
public class ErrorResponse {
private Integer code;
private String message;
private Object trace;
}
4. GlobalExcepitonHandler
🛑 GlobalExcepitonHandler.java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = BizException.class)
public ErrorResponse bizExceptionHandler(BizException e) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setCode(e.getCode());
errorResponse.setMessage(e.getMessage());
errorResponse.setTrace(e.getStackTrace());
return errorResponse;
}
@ExceptionHandler(value = Exception.class)
public ErrorResponse ExceptionHandler(Exception e) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setCode(ExceptionType.INNER_ERROR.getCode());
errorResponse.setMessage(ExceptionType.INNER_ERROR.getMessage());
return errorResponse;
}
@ExceptionHandler(value = AccessDeniedException.class)
@ResponseStatus(HttpStatus.FORBIDDEN)
public ErrorResponse accessDeniedHandler(Exception e) {
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setCode(ExceptionType.FORBIDDEN.getCode());
errorResponse.setMessage(ExceptionType.FORBIDDEN.getMessage());
return errorResponse;
}
@ExceptionHandler(value = MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse bizExceptionHandler(MethodArgumentNotValidException e) {
ErrorResponse errorResponse = new ErrorResponse();
e.getBindingResult().getAllErrors().forEach(objectError -> {
errorResponse.setCode(ExceptionType.BAD_REQUEST.getCode());
errorResponse.setMessage(objectError.getDefaultMessage());
});
return errorResponse;
}
}