Spring|Spring Boot异常处理与单元测试

1.SpringBoot异常处理方式
2.SpringBoot单元测试
1.SpringBoot异常处理方式

  1. 自定义错误页面
  2. @ExceptionHandle 注解处理异常
  3. @ControllerAdvice+@ExceptionHandler 注解处理异常
  4. 配置SimpleMappingExceptionResolver 处理异常
  5. 自定义HandlerExceptionResolver 类处理异常


1. 自定义错误页面
捕获所有的异常,全部都跳转到error页面
SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常SpringBoot 会像/error 的url 发送请求。在springBoot 中提供了一个叫BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。
如果我们需要将所有的异常同一跳转到自定义的错误页面, 需要在src/main/resources/templates 目录下创建error.html 页面。注意:名称必须叫error
  • 在页面中可以通过th:text="${exception}"获取错误信息
错误提示页面 - 锐客网 出错了,请与管理员联系。。。

2. @ExceptionHandle 注解处理异常
【Spring|Spring Boot异常处理与单元测试】在某个Controller类中,添加一个方法,返回值为ModelAndView,并加注解@ExceptionHandle(value=https://www.it610.com/article/{异常})来捕获指定一个或多个异常
缺点:只能针对单个控制器类
  • 可以捕获一个or多个异常(value值为一个数组,可以存放一个或多个异常,数组中值为异常类(异常.class))
    @ExceptionHandler(value = https://www.it610.com/article/{java.lang.ArithmeticException.class})
  • 只能对该方法所在的控制器有效,如果有多个控制器,对其他的没有用
  • 可以指定异常后跳转页面,并能携带异常信息
@ExceptionHandler(value = https://www.it610.com/article/{java.lang.ArithmeticException.class}) public ModelAndView getException(Exception e){ ModelAndView mv = new ModelAndView(); // 往modelandview对象中添加错误信息 mv.addObject("error", e.toString()); // 通过modelandview对象执行跳转页面 mv.setViewName("error1"); return mv; }

3. @ControllerAdvice+@ExceptionHandler 注解处理异常
创建一个能够处理异常的全局异常类,在该类上添加@ControllerAdvice注解,并在类中的方法添加@ExceptionHandler注解来捕获指定的异常,正常一个方法对应一个异常
4. 配置SimpleMappingExceptionResolver 处理异常
优点:简化@ControllerAdvice+@ExceptionHandler 注解处理异常方法,通过一个方法,来处理异常
缺点:不能携带异常信息,只能捕获异常,并指定跳转
实现步骤 4.1 编写全局异常类,给类添加@Configration注解
4.2 新建方法,方法返回值为SimpleMappingExceptionResolver ,并加上@Bean注解
4.3 实现该方法
(1)new一个SimpleMappingExceptionResolver对象
(2)编写异常类型与视图的映射(properties参数)
(3)将定义好的映射关系加入到参数中
(3)将参数通过setExceptionMappings方法传递给SimpleMappingExceptionResolver对象中
@Configuration public class GlobalException { /** * 该方法必须要有返回值。返回值类型必须是: SimpleMappingExceptionResolver */ @Bean public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){ SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver(); Properties mappings = new Properties(); /** * 参数一:异常的类型,注意必须是异常类型的全名 * 参数二:视图名称 */ mappings.put("java.lang.ArithmeticException", "error1"); mappings.put("java.lang.NullPointerException","error2"); //设置异常与视图映射信息的 resolver.setExceptionMappings(mappings); return resolver; } }

5. 自定义HandlerExceptionResolver 类处理异常
优化第四种异常处理方法,使其可以携带异常信息
实现步骤 5.1 通过实现HandlerExceptionResolver 接口做全局异常处理
5.2 在实现类上添加@Configuration注解
5.3 重写resolveException方法
(1)new一个ModelAndView对象
(2)判断不同的异常信息,做不同视图跳转
(3)返回modelandview对象
@Configuration public class GlobalException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { ModelAndView mv = new ModelAndView(); // 判断不同异常类型,做不同视图跳转 if(e instanceof ArithmeticException){ mv.setViewName("error1"); } if (e instanceof NullPointerException){ mv.setViewName("error2"); } // 添加错误信息到modelandview对象中 mv.addObject("error", e.toString()); return mv; } }

2.SpringBoot单元测试
  1. 配置pom文件
  2. 编写测试类


  1. 配置pom文件
org.springframework.boot spring-boot-starter-test

  1. 编写测试类
    在src/test/java/com.xxx.test下
    2.1 @RunWith:启动器
    2.2 @SpringBootTest(classes={App.class})
    2.3 @Test
@RunWith:启动器
SpringJUnit4ClassRunner.class:让junit 与spring 环境进行整合
@SpringBootTest(classes={App.class})
1,当前类为springBoot 的测试类
2,加载SpringBoot 启动类。启动springBoot
@Test
给测试方法上加该注解
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = {App.class}) public class UserServiceTest {@Autowired private UserServceImpl userServceImpl; @Test public void testAddUser(){ this.userServceImpl.addUser(); } }

    推荐阅读