SpringBoot项目基础设施搭建( 三 )


4、全局异常处理类
@ControllerAdvice@Slf4jpublic class GlobalExceptionHandler {* 处理自定义的api异常* @param e* @return@ResponseBody@ExceptionHandler(value = https://www.isolves.com/it/cxkf/kj/2022-11-18/BusinessException.class)public Result handle(BusinessException e) {if (Objects.nonNull(e.getErrorCode())) {log.error("发生业务异常!原因是:{}", e.getErrorMsg());return Result.failed(e.getErrorCode(), e.getErrorMsg());return Result.failed(e.getMessage());* 处理参数验证失败异常 基于json格式的数据传递 , 这种传递才会抛出MethodArgumentNotValidException异常* @param e* @return@ResponseBody@ExceptionHandler(value = MethodArgumentNotValidException.class)public Result handleValidException(MethodArgumentNotValidException e) {BindingResult bindingResult = e.getBindingResult();String message = null;if (bindingResult.hasErrors()) {FieldError fieldError = bindingResult.getFieldError();if (Objects.nonNull(fieldError)) {message = fieldError.getField() + fieldError.getDefaultMessage();return Result.validateFailed(message);* 使用@Validated 来校验 JavaBean的参数 , 比如@NotNull、@NotBlank等等; post 请求数据传递有两种方式 , 一种是基于form-data格式的数据传递 , 这种传递才会抛出BindException异常* @param e* @return@ResponseBody@ExceptionHandler(value = BindException.class)public Result handleValidException(BindException e) {BindingResult bindingResult = e.getBindingResult();String message = null;if (bindingResult.hasErrors()) {FieldError fieldError = bindingResult.getFieldError();if (fieldError != null) {message = fieldError.getField() + fieldError.getDefaultMessage();return Result.validateFailed(message);复制代码统一返回格式
目前比较流行的是基于 json 格式的数据交互 。但是 json 只是消息的格式 , 其中的内容还需要我们自行设计 。不管是 HTTP 接口还是 RPC 接口保持返回值格式统一很重要 , 这将大大降低 client 的开发成本 。
定义返回值四要素
 

  • boolean success ;是否成功 。
  • T data ;成功时具体返回值 , 失败时为 null。
  • String code ;成功时返回 200  , 失败时返回具体错误码 。
  • String message ;成功时返回 null  , 失败时返回具体错误消息 。
 
返回对象中会处理分页结果 , 普通的查询结果 , 异常等信息 。
@Data@NoArgsConstructorpublic class Result implements Serializable {private T data;private String code;private String message;private boolean success;protected Result(String code, String message, T data) {this.code = code;this.message = message;this.data = https://www.isolves.com/it/cxkf/kj/2022-11-18/data;this.success = true;protected Result(String code, String message, T data, boolean success) {this(code, message, data);this.success = success;public static Result ok() {return ok((T) null);* 成功返回结果* @param data 获取的数据* @returnpublic static Result ok(T data) {return new Result<>(ExceptionEnum.SUCCESS.getResultCode(),ExceptionEnum.SUCCESS.getResultMsg(), data);* 成功返回list结果* @param list 获取的数据* @returnpublic static Result> ok(List list) {Result> listResult = new Result<>(ExceptionEnum.SUCCESS.getResultCode(),ExceptionEnum.SUCCESS.getResultMsg(), list);return listResult;* 成功返回结果* @param data 获取的数据* @param message 提示信息public static Result ok(T data, String message) {return new Result<>(ExceptionEnum.SUCCESS.getResultCode(), message, data);* 失败返回结果* @param error 错误码public static Result failed(IError error) {return new Result<>(error.getResultCode(), error.getResultMsg(), null, false);* 失败返回结果* @param error 错误码* @param message 错误信息public static Result failed(IError error, String message) {return new Result<>(error.getResultCode(), message, null, false);* 失败返回结果* @param errorCode 错误码* @param message 错误信息public static Result failed(String errorCode, String message) {return new Result<>(errorCode, message, null, false);* 失败返回结果* @param message 提示信息public static Result failed(String message) {return new Result<>(ExceptionEnum.INTERNAL_SERVER_ERROR.getResultCode(), message, null, false);* 失败返回结果public static Result failed() {return failed(ExceptionEnum.INTERNAL_SERVER_ERROR);* 参数验证失败返回结果public static Result validateFailed() {return failed(ExceptionEnum.VALIDATE_FAILED);* 参数验证失败返回结果* @param message 提示信息public static Result validateFailed(String message) {return new Result<>(ExceptionEnum.VALIDATE_FAILED.getResultCode(), message, null, false);* 未登录返回结果public static Result unauthorized(T data) {return new Result<>(ExceptionEnum.UNAUTHORIZED.getResultCode(),ExceptionEnum.UNAUTHORIZED.getResultMsg(), data, false);* 未授权返回结果public static Result forbidden(T data) {return new Result


推荐阅读