Spring Boot异常处理与单元测试

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

1.SpringBoot异常处理方式

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

    捕获所有的异常,全部都跳转到error页面

    SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常SpringBoot 会像/error 的url 发送请求。在springBoot 中提供了一个叫BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。

    如果我们需要将所有的异常同一跳转到自定义的错误页面, 需要在src/main/resources/templates 目录下创建error.html 页面。注意:名称必须叫error

  • 在页面中可以通过th:text="${exception}"获取错误信息
  • <!DOCTYPE html>
        <meta charset="UTF-8">
        <title>错误提示页面</title>
    </head>
    出错了,请与管理员联系。。。
    <span th:text="${exception}"></span>
    </body>
    </html>
    

    2. @ExceptionHandle 注解处理异常

    在某个Controller类中,添加一个方法,返回值为ModelAndView,并加注解@ExceptionHandle(value={异常})来捕获指定一个或多个异常
    缺点:只能针对单个控制器类

  • 可以捕获一个or多个异常(value值为一个数组,可以存放一个或多个异常,数组中值为异常类(异常.class))
    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
  • 只能对该方法所在的控制器有效,如果有多个控制器,对其他的没有用
  • 可以指定异常后跳转页面,并能携带异常信息
  •     @ExceptionHandler(value = {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单元测试

  • 配置pom文件
  • 编写测试类
  • 配置pom文件
  •         <!-- 添加junit环境的jar包 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
    
  • 编写测试类
    在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