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