【SpringBoot】项目中@RestControllerAdvice自定义Exception异常处理

需求

目前公司框架封装了异常处理,但是在使用@Validated注解去判断字段的时候,返回的异常是一堆异常栈,所以要重新针对@Validated抛出的异常去自定义一下,遇到这个异常MethodArgumentNotValidException就拦截,处理在抛出去。

实现

自定义异常拦截
ApiResult 是公司框架自己封装的,所以要整合成一样的。

import org.springframework.core.annotation.Order;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @author cf
 * @date 2023/4/12上午 11:31
 */
@Order(999999)
@RestControllerAdvice
public class ConfigExceptionHandler {
    
    

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ApiResult<?> handlerException(MethodArgumentNotValidException e) {
    
    
        MethodArgumentNotValidExceptionAction methodArgumentNotValidExceptionAction = new MethodArgumentNotValidExceptionAction(e.getParameter(),e.getBindingResult());
        return ApiResult.error(methodArgumentNotValidExceptionAction.getMessage());
    }
}

重写MethodArgumentNotValidExceptionAction

import org.springframework.core.MethodParameter;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;

import java.util.Iterator;

/**
 * @author cf
 * @description: 针对Validated 异常抛出处理
 * @date 2023/4/12下午 2:05
 */
public class MethodArgumentNotValidExceptionAction extends Exception {
    
    
    private final MethodParameter parameter;
    private final BindingResult bindingResult;

    public MethodArgumentNotValidExceptionAction(MethodParameter parameter, BindingResult bindingResult) {
    
    
        this.parameter = parameter;
        this.bindingResult = bindingResult;
    }

    public MethodParameter getParameter() {
    
    
        return this.parameter;
    }

    public BindingResult getBindingResult() {
    
    
        return this.bindingResult;
    }

    //这里对异常进行了封装
    public String getMessage() {
    
    
        Iterator var2 = this.bindingResult.getAllErrors().iterator();
        StringBuilder sb = new StringBuilder();
        while (var2.hasNext()) {
    
    
            ObjectError error = (ObjectError) var2.next();
            sb.append("[").append(error.getDefaultMessage()).append("] ");
        }
        return sb.toString();
    }
}

注意点

最好在扫描的时候加上此目录的扫描。@ComponentScan里面

效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/daohangtaiqian/article/details/130107796