天天看点

SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试

文章目录

  • 自定义错误页面
  • 通过@ExceptionHandler注解处理异常
  • @[email protected]
  • SimpleMappingExceptionResolver处理
  • 自定义HandlerExceptionResolver对象异常处理
  • junit 测试

Gitee地址

自定义错误页面

这是我们用来测试的bug,当项目启动时,系统会报错

SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试
SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试

因此,我们需要在template页面下创建一个名为

error.html

的文件用于异常报错 ( 注意命名不可改 )

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Error</title>
</head>
<body>
    出错了。。。
</body>
</html>
           

再次启动,

SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试

通过@ExceptionHandler注解处理异常

  • 然而上述方法对于不同的异常并不能很好的处理,下面给出另一种方案
  • 依然在controller中给出
    @ExceptionHandler(value = {java.lang.NullPointerException.class})//可以多个
        public ModelAndView nullPointExcept(Exception e){
            ModelAndView mv =new ModelAndView();
            mv.addObject("err",e.toString());
            mv.setViewName("error1");  //设置跳转的视图
            return mv;
        }
               
    对应的跳转界面
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>error1</title>
</head>
<body>
    <span th:text="${err}"/>
</body>
</html>
           

@[email protected]

  • 依然,上一个方法存在的弊端是处理异常的方法和能够产生异常的方法必须在同一个controller中,代码不复用
  • 全局处理方式

    新建全局异常处理类

    SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试
package com.example.springbootjunit.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.sound.midi.MidiDevice;

/**
 * 全局异常处理类
 */
@ControllerAdvice
public class GlobalException {

    @ExceptionHandler(value = {java.lang.NullPointerException.class})//可以多个
    public ModelAndView nullPointExcept(Exception e){
        ModelAndView mv =new ModelAndView();
        mv.addObject("err",e.toString());
        mv.setViewName("error1");  //设置跳转的视图
        return mv;
    }

    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public ModelAndView arithExcept(Exception e){
        ModelAndView mv= new ModelAndView();
        mv.addObject("err",e.toString());
        mv.setViewName("error2");
        return mv;
    }
}

           
SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试

SimpleMappingExceptionResolver处理

  • 依然,上一个方法的缺点是,全局异常处理类中方法太多
  • 通过一个方法处理不同异常
    SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试
    -

    GlobalException.java

    package com.example.springbootjunit.exception;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
    
    import java.util.Properties;
    
    /**
     * 全局异常处理类
     * SimpleMappingExceptionResolver
     */
    @Configuration
    public class GlobalExceptionEx {
    
        /**
         * 此方法返回值必须是这个对象
         * @return
         */
        @Bean
        public SimpleMappingExceptionResolver getSimpleExcept() {
    
            SimpleMappingExceptionResolver simpleExcept = new SimpleMappingExceptionResolver();
    
            Properties properties = new Properties();
            properties.put("java.lang.NullPointerException","error3");  //添加异常映射
            properties.put("java.lang.ArithmeticException","error4");
            simpleExcept.setExceptionMappings(properties);
    
            return simpleExcept;
        }
    }
    
               
  • 对应的html只能手动输入异常信息,不能传递了。。。。。

自定义HandlerExceptionResolver对象异常处理

  • 依然的依然,上一个方法不能传递异常信息
  • SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试
package com.example.springbootjunit.exception;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.Null;

/**
 * 自定义HandlerExceptionResolver对象异常处理
 * 必须要实现接口 HandlerExceptionResolver
 */
@Configuration
public class GlobalExceptionExEx implements HandlerExceptionResolver {

    /**
     *
     * @param httpServletRequest  产生异常的请求对象
     * @param httpServletResponse 产生异常的请求对象
     * @param o  即 handler 产生异常的对象
     * @param e 异常
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {

        ModelAndView mv = new ModelAndView();
        //判断不同异常类型,做不同跳转
        if(e instanceof NullPointerException){
            mv.setViewName("error5");
        }
        if(e instanceof ArithmeticException){
            mv.setViewName("error6");
        }
        mv.addObject("error", e.toString());
        //......
        return mv;
    }
}

           

junit 测试

默认自带test依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <!--排除了junit-vintage-engine(junit3,junit4), RunWith爆红的原因-->
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
           
  • 测试代码
    SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试
/**
 * junit5 只需一个注解,,
 */
@SpringBootTest//(classes = SpringBootJunitApplication.class)//多个启动类的话要指定启动类(Spring
class SpringBootJunitApplicationTests {

    @Autowired
    private UsersServiceImpl usersService;

    @Test
    void contextLoads() {
        this.usersService.addUser();
    }

}

}

           

右键单击测试方法Run即可

SpringBoot 异常处理与测试自定义错误页面通过@ExceptionHandler注解处理异常@[email protected]SimpleMappingExceptionResolver处理自定义HandlerExceptionResolver对象异常处理junit 测试

继续阅读