目录
一、异常处理
(一)、@ControllerAdvice+@ExceptionHandler 注解处理异常
(二) 自定义 HandlerExceptionResolver 类处理异常
二、事务Aop的相关使用(主要说明事务的使用方式)
(一)事务的基本配置
三、拦截器的相关配置和使用
基本步骤:
第一步:编写一个拦截器实现HandlerInterceptor接口
第二步:拦截器注册到容器(实现WebMVCConfig的addInterceptor)
自定义类实现HandlerInterceptor接口并使用@Component注入IOC容器,从写PreHandler方法
第三步:指定拦截规则()如果是拦截所有的请求,静态资源也会被拦截
一、异常处理
(一)、@ControllerAdvice+@ExceptionHandler 注解处理异常
ExceptionConfig类使用@ControllerAdice进行标注
在方法上会用@ExceptionHandler(异常的反射对象,也可以是自定义异常类)
/**
* 全局异常处理类
*/
@ControllerAdvice
public class GlobalController {
/**
* 该方法返回ModelAndView:目的是为了可以让我们封装视图和错误信息
* @param e 参数 Exception e:会将产生异常对象注入到方法中
* @return
*/
//拦截的异常可以写Exception
@ExceptionHandler(value = {java.lang.ArithmeticException.class})
public ModelAndView arithmeticExceptionHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg",e+"controllerAdvice");
mv.setViewName("error");
return mv;
}
}
(二) 自定义 HandlerExceptionResolver 类处理异常
上一种方式不能在跳转页面的同时携带异常信息,这样不利于排错,当前这种方式可以解决上述问题,我们需 要 在全局异常处理类中实现HandlerExceptionResolver 接口。
@Configuration
public class MyExceptionReslover implements HandlerExceptionResolver {
/**
* 处理异常的方法
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @param ex
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
Object o, Exception ex) {
ModelAndView mv = new ModelAndView();
// 判断不同异常类型,做不同视图跳转
if (ex instanceof ArithmeticException) {
mv.setViewName("error4");
}
if (ex instanceof NullPointerException) {
mv.setViewName("error5");
}
mv.addObject("error", ex.toString());
return mv;
}
}
二、事务Aop的相关使用(主要说明事务的使用方式)
(一)事务的基本配置
第一步:添加 依赖
<!--事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.22</version>
</dependency>
aop相关依赖版本仲裁
<!--面向切面编程-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
第二步:直接在启动的主方法上添加@EnableTransactionManagement开启事务
第三步:直接在需要使用transaction的service层添加@Transaction注解(开启注解)
三、拦截器的相关配置和使用
基本步骤:
第一步:编写一个拦截器实现HandlerInterceptor接口
第二步:拦截器注册到容器(实现WebMVCConfig的addInterceptor)
自定义类实现HandlerInterceptor接口并使用@Component注入IOC容器,从写PreHandler方法
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Component
@Slf4j
public class TestInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//打印拦截路径
String requestURI = request.getRequestURI();
//打印请求路径
log.debug("\n{}",requestURI);
//检验登录逻辑
HttpSession session = request.getSession();
Object id = session.getAttribute("id");
if (id!=null){
//代表放行
return true;
}
//表示拦截
return false;
}
}
/*
* 第一步:编写一个拦截器实现HandlerInterceptor接口
* 第二步:拦截器注册到容器(实现WebMVCConfig的addInterceptor)
* 第三步:指定拦截规则()如果是拦截所有的请求,静态资源也会被拦截
*
* */
第三步:指定拦截规则()如果是拦截所有的请求,静态资源也会被拦截
自定类InterceptorConfig 实现 WebMVCConfig接口,重写addInterceptor方法
import com.qf.jx.boot.springbootexercise1.interceptor.TestInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
/*
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("doc.html").
addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").
addResourceLocations("classpath:/META-INF/resources/webjars/");
}
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TestInterceptor())
//指定所有的请求都被拦截
.addPathPatterns("/**")
//指定放行的路径
.excludePathPatterns("/","/login");
}
}