8. SpringBoot异常处理&拦截器

1.0 异常处理

全局异常处理类

import com.demo.vo.HttpResult;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.ArrayList;
import java.util.List;

/**
 * 定义全局异常类
 * 全局异常控制类加入拦截
 */
@RestControllerAdvice
public class GlobalExceptionHandle {
    
    @ExceptionHandler(value = BindException.class)
    public HttpResult bindExceptionErrorHandler(BindException ex) throws Exception {
        List<String> errorList=new ArrayList<>();
        if(ex.hasErrors()){
            List<ObjectError> list=ex.getAllErrors();
            for(ObjectError objectError:list){
                errorList.add(objectError.getDefaultMessage());
            }
//            ex.getAllErrors().forEach( objectError -> errorList.add(objectError.getDefaultMessage()));
        }
        if(!errorList.isEmpty()){
            return HttpResult.error(errorList);
        }
        return HttpResult.error();
    }
}

2.0 拦截器

2.1 拦截器类

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("my interceptor prehandles");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("my interceptor postHandler");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("my interceptor aferCompletion");
    }
}

2.2 开启拦截器

import com.demo.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/hello");
    }
}

拦截器中方法的执行顺序:preHandle-->Controller-->postHandle-->afterCompletion

原文地址:https://www.cnblogs.com/forelim/p/15395007.html