007. Spring Boot(1.5.10版本)异常处理+整合 Junit 单元测试(高级)

SpringBoot 中异常处理方式

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

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>

在这里插入图片描述

/**
* SpringBoot 处理异常方式一: 自定义错误页面
* * *
/
//触发异常的两个方法
@Controller
public class DemoController {
@RequestMapping("/show")
public String showInfo(){
String str = null;
str.length();
return "index";
} 
@RequestMapping("/show2")
public String showInfo2(){
int a = 10/0;
return "index";
}

@ExceptionHandle 注解处理异常(可以指定返回错误的页面—缺点代码过多 冗余了难以复用)

对特定异常 跳到特定的页面

 /
**
* 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");
return mv;
} 

//返回  ModelAndView --->视图跳转 和其他信息的展示
/
**
* 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");
return mv;
}
}

@ControllerAdvice+@ExceptionHandler 注解处理异常(全局处理异常对所有Controller处理)

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

* 全局异常处理类
* 
/
@ControllerAdvice
public class 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");
return mv;
}

 /
**
* 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");
return mv;
}
}

配置 SimpleMappingExceptionResolver 处理异常(缺点:没有办法 传递异常对象 无法定位异常)

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

/**
* 通过 SimpleMappingExceptionResolver 做全局异常处理
* * *
/
@Configuration
public class GlobalException {
/**
* 该方法必须要有返回值。 返回值类型必须是:
SimpleMappingExceptionResolver
*/
@Bean
public SimpleMappingExceptionResolver
getSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new
SimpleMappingExceptionResolver();

Properties mappings = new Properties();
//mappings  来添加映射关系"异常类型","跳转的位置"
/**
* 参数一: 异常的类型, 注意必须是异常类型的全名
* 参数二: 视图名称
*/
mappings.put("java.lang.ArithmeticException", "error1");
mappings.put("java.lang.NullPointerException","error2");
//设置异常与视图映射信息的
resolver.setExceptionMappings(mappings);
return resolver;
}
}

@Configuration 配置和@Bean

转载:https://www.cnblogs.com/duanxz/p/7493276.html

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

Spring3.0之前要使用Spring必须要有一个xml配置文件,而Spring3.0之后注解慢慢登上舞台,通过注解@Configuration和@Bean可以完全搞定。此时,注解和xml配置形成了相互协作与竞争的关系。随着Springboot的推广,注解的使用在Spring中大放光彩,xml的辉煌一去不返。通过注解,简化了配置,提升了编码效率。

Spring 3.0新增了另外两个实现类:AnnotationConfigApplicationContext 和 AnnotationConfigWebApplicationContext。它们是为注解而生,直接依赖于注解作为容器配置信息来源的IoC容器初始化类。AnnotationConfigWebApplicationContext是AnnotationConfigApplicationContext的web版本,其用法与后者相比几乎没有什么差别。

基于Java类的配置选项

Spring 3.0引入了注解,配置文件的载体就从xml文件转换为了Java类,Java类就是一个普通的类,除了命名建议以“**Config”结尾方便识别外,Spring对其有一定的约定条件。

配置类不能是 final 类(没法动态代理)。
配置类必须是非本地的(即不能将配置类定义在其他类的方法内部,不能是private)。
配置类必须有一个无参构造函数。

基本使用方法
符合上述条件的类,就可以使用@Configuration来进行注解,表示这个类可以使用Spring IoC容器作为bean定义的来源。

@Bean注解在该类的方法上,AnnotationConfigApplicationContext将配置类中标注了@Bean的方法的返回值识别为Spring Bean,并注册到容器中,归入IoC容器管理。

@Configuration的属性

@Configuration的定义代码:
在这里插入图片描述

@Bean属性

在这里插入图片描述

自定义 HandlerExceptionResolver 类处理异常

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

/**
* 通过实现 HandlerExceptionResolver 接口做全局异常处理
* * *
/
@Configuration
public class GlobalException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler,
Exception ex) {
ModelAndView mv = new ModelAndView();
//判断不同异常类型, 做不同视图跳转
if(ex instanceof ArithmeticException){
mv.setViewName("error1");
  } 
if(ex instanceof NullPointerException){
mv.setViewName("error2");
} 

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

Spring Boot 整合 Junit 单元测试

pom文件添加

<!-- 添加 junit 环境的 jar  -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

编写测试类

/**
* 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})
public class UserServiceTest {
@Autowired
private UserServiceImpl userServiceImpl;
@Test
public void testAddUser(){
this.userServiceImpl.addUser();
}
}
发布了162 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39088066/article/details/103565524