SpringBoot 添加全局异常统一处理代码
发布日期:2021-05-08 00:27:31 浏览次数:14 分类:精选文章

本文共 2805 字,大约阅读时间需要 9 分钟。

文章目录

本文需要结合 部分代码。


可以提供一个自定义异常,使用已定义好的错误码枚举ResultCode,用来在代码中对可预知的异常进行抛出处理。

package com.example.demo.exception;import com.example.demo.result.ResultCode;import lombok.Getter;/** * 自定义异常 * @auther wangbo * @date 2021-01-13 17:27 */@Getterpublic class CustomException extends RuntimeException{       private ResultCode resultCode;    public CustomException(ResultCode resultCode){           super(resultCode.getMessage());        this.resultCode = resultCode;    }}

接下来需要提供一个全局异常统一处理类,主要用到两个注解:@RestControllerAdvice@ExceptionHandler

package com.example.demo.advice;import com.example.demo.exception.CustomException;import com.example.demo.result.Result;import lombok.extern.slf4j.Slf4j;import org.springframework.validation.BindingResult;import org.springframework.validation.FieldError;import org.springframework.web.bind.MethodArgumentNotValidException;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ValidationException;/** * 全局异常统一处理 * * @auther wangbo * @date 2021-01-13 17:16 */@Slf4j@RestControllerAdvicepublic class ExceptionHandlerAdvice {       /**     * 通用异常处理     */    @ExceptionHandler(Exception.class)    public Result exceptionHandler(Exception e) {           log.info("通用异常处理");        return Result.failure(e.getMessage());    }    /**     * 自定义异常处理     */    @ExceptionHandler(CustomException.class)    public Result customExceptionHandler(CustomException e) {           log.info("自定义异常处理");        return Result.error(e.getResultCode());    }    /**     * 参数校验异常处理     */    @ExceptionHandler(MethodArgumentNotValidException.class)    public Result methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {           log.info("参数校验异常处理");        BindingResult bindingResult = e.getBindingResult();        FieldError fieldError = bindingResult.getFieldError();        assert fieldError != null;        return Result.failure(fieldError.getField() + " : " + fieldError.getDefaultMessage());    }    /**     * 参数校验过程异常处理     */    @ExceptionHandler(ValidationException.class)    public Result validationExceptionHandler(ValidationException e) {           log.info("参数校验过程异常处理");        String message = e.getCause().getMessage();        if (message != null) {               return Result.failure(message);        }        return Result.failure("请求参数校验错误");    }}

最后两个有关参数校验的异常处理在本文中并没有使用,是在接口参数校验中用到,见另一篇文章。

使用示例,直接进行抛出,抛出的异常会在全局异常处理类中统一进行处理:

@GetMapping("/list")public List
list(){ if (true){ //直接抛出异常,该自定义异常会被ExceptionHandlerAdvice类中的customExceptionHandler方法处理。 throw new CustomException(ResultCode.REQUEST_PARAM_ERROR); } return userService.list();}

这个接口会直接返回如下结果:

{       "code":50001,    "message":"请求参数错误",    "data":null}
上一篇:SpringBoot 使用注解进行接口参数校验
下一篇:SpringBoot 封装接口返回数据的统一结构

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月16日 13时58分41秒