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 注解处理异常

在某个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单元测试

  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();
    }
}

你可能感兴趣的:(Spring Boot异常处理与单元测试)