Spring Boot异常处理与单元测试

Spring Boot异常处理与单元测试

(SpringBoot高级)

一、         SpringBoot中异常处理方式

1         SpringBoot中对于异常处理提供了五种处理方式

1.1     自定义错误页面

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


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

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>错误提示页面</title>

</head>

<body>

    出错了,请与管理员联系。。。

    <span th:text="${exception}"></span>

</body>

</html>

 

1.2     @ExceptionHandle注解处理异常

1.2.1        Controller

/**

 * SpringBoot处理异常方式一:自定义错误页面

 *

 *此方式的弊端就是在每一个类当中创建异常处理方法,不能将达到复用,代码耦合度很高

 */

@Controller

publicclass DemoController {

   

    @RequestMapping("/show")

    public String showInfo(){

        String str = null;

        str.length();

        return"index";

    }

   

    @RequestMapping("/show2")

    public String showInfo2(){

        inta = 10/0;

        return"index";

    }

   

    /**

     * java.lang.ArithmeticException

     * 该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定

     * 参数Exception e:会将产生异常对象注入到方法中

     */

    @ExceptionHandler(value={java.lang.ArithmeticException.class})

    public ModelAndView arithmeticExceptionHandler(Exception e){

        ModelAndView mv = new ModelAndView();

        mv.addObject("error", e.toString());

        mv.setViewName("error1");

        returnmv;

    }

   

    /**

     * java.lang.NullPointerException

     * 该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定

     * 参数Exception e:会将产生异常对象注入到方法中

     */

    @ExceptionHandler(value={java.lang.NullPointerException.class})

    public ModelAndView nullPointerExceptionHandler(Exception e){

        ModelAndView mv = new ModelAndView();

        mv.addObject("error", e.toString());

        mv.setViewName("error2");

        returnmv;

    }  

}

1.2.2        页面

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>错误提示页面-ArithmeticException</title>

</head>

<body>

    出错了,请与管理员联系。。。

    <span th:text="${error}"></span>

</body>

</html>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>错误提示页面-NullPointerException</title>

</head>

<body>

    出错了,请与管理员联系。。。

    <span th:text="${error}"></span>

</body>

</html>

1.3     @ControllerAdvice+@ExceptionHandler注解处理异常

1.3.1        需要创建一个能够处理异常的全局异常类。在该类上需要添加@ControllerAdvice注解

/**

 * 全局异常处理类

 *

 *

 */

@ControllerAdvice

publicclass GlobalException {

    /**

     * java.lang.ArithmeticException

     * 该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定

     * 参数Exception e:会将产生异常对象注入到方法中

     */

    @ExceptionHandler(value={java.lang.ArithmeticException.class})

    public ModelAndView arithmeticExceptionHandler(Exception e){

        ModelAndView mv = new ModelAndView();

        mv.addObject("error", e.toString());

        mv.setViewName("error1");

        returnmv;

    }

   

    /**

     * java.lang.NullPointerException

     * 该方法需要返回一个ModelAndView:目的是可以让我们封装异常信息以及视图的指定

     * 参数Exception e:会将产生异常对象注入到方法中

     */

    @ExceptionHandler(value={java.lang.NullPointerException.class})

    public ModelAndView nullPointerExceptionHandler(Exception e){

        ModelAndView mv = new ModelAndView();

        mv.addObject("error", e.toString());

        mv.setViewName("error2");

        returnmv;

    }

   

}

 

1.4     配置SimpleMappingExceptionResolver处理异常

1.4.1        在全局异常类中添加一个方法完成异常的同一处理

/**

 * 通过SimpleMappingExceptionResolver做全局异常处理

 *

 *

 */

@Configuration

publicclass 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);

       

        returnresolver;

    }

   

}

1.5     自定义HandlerExceptionResolver类处理异常

1.5.1        需要再全局异常处理类中实现HandlerExceptionResolver接口

/**

 * 通过实现HandlerExceptionResolver接口做全局异常处理

 *

 *

 */

@Configuration

publicclass GlobalException implements HandlerExceptionResolver {

 

    @Override

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,

            Exception ex) {

        ModelAndView mv = new ModelAndView();

        //判断不同异常类型,做不同视图跳转

        if(exinstanceof ArithmeticException){

            mv.setViewName("error1");

        }

       

        if(exinstanceof NullPointerException){

            mv.setViewName("error2");

        }

        mv.addObject("error", ex.toString());

       

        returnmv;

    }

}

二、         Spring Boot整合Junit单元测试

1         创建项目

2         修改pom文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>1.5.10.RELEASE</version>

  </parent>

  <groupId>com.bjsxt</groupId>

  <artifactId>19-spring-boot-test</artifactId>

  <version>0.0.1-SNAPSHOT</version>

 

  <properties>

    <java.version>1.7</java.version>

  </properties>

 

  <dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    <!-- 添加junit环境的jar包 -->

    <dependency>

        <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-test</artifactId>

    </dependency>

  </dependencies>

</project>

3         编写业务代码

3.1     Dao

@Repository

publicclass UserDaoImpl {

 

    publicvoid saveUser(){

        System.out.println("insert into users.....");

    }

}

3.2     业务层

@Service

publicclass UserServiceImpl {

 

    @Autowired

    private UserDaoImpl userDaoImpl;

   

    publicvoid addUser(){

        this.userDaoImpl.saveUser();

    }

}

3.3     编写启动类

@SpringBootApplication

publicclass App {

 

    publicstaticvoid main(String[] args) {

        SpringApplication.run(App.class, args);

    }

 

}

4         使用SpringBoot整合Junit做单元测试

4.1     编写测试类

/**

 * SpringBoot测试类

 *@RunWith:启动器

 *SpringJUnit4ClassRunner.class:让junit与spring环境进行整合

 *

 *@SpringBootTest(classes={App.class}) 1,当前类为springBoot的测试类

 *@SpringBootTest(classes={App.class}) 2,加载SpringBoot启动类。启动springBoot

 *

 *junit与spring整合 @Contextconfiguartion("classpath:applicationContext.xml")

 */

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest(classes={App.class})

publicclass UserServiceTest {

 

    @Autowired

    private UserServiceImpl userServiceImpl;

   

    @Test

    publicvoid testAddUser(){

        this.userServiceImpl.addUser();

    }

}

猜你喜欢

转载自blog.csdn.net/add_del/article/details/80342811