一、SpringBoot异常处理
SpringBoot 中对于异常处理提供了五种处理方式。
1.自定义错误页面:
SpringBoot默认的处理异常的机制: SpringBoot默认的已经提供了一套处理异常的机制。 一旦程序中出现了异常 SpringBoot 会向/error 的 url 发送请求。在 SpringBoot 中提供了一个 名为 BasicErrorController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。
如 果 我 们 需 要 将 所 有 的 异 常 同 一 跳 转 到 自 定 义 的 错 误 页 面 , 需 要 再 src/main/resources/templates 目录下创建 error.html 页面;页面名称必须叫 error。
2.通过@ExceptionHandler处理异常:
用来统一的处理方法抛出的异常;操作示例。
- 修改Controller
@Controller
public class ErrorController {
@RequestMapping("show")
public String show() {
String str = null;
str.length();
// int a=3/0;
return "ok";
}
@ExceptionHandler(value = {java.lang.ArithmeticException.class})
public ModelAndView arithmetic(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());
mv.setViewName("error");
return mv;
}
}
- 创建页面:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>错误页面</title>
</head>
<body>
<h3 >操作失败!!!<span th:text="${error}"></span></h3>
</body>
</html>
3.通过@ControllerAdvice 与@ExceptionHandler=处理异常:
@ControllerAdvice是一个增强的Controller用于处理全局异常。
- 创建全局异常处理类:
@ControllerAdvice
public class GlobalException {
@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView arithmetic(java.lang.Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error",e.toString());
mv.setViewName("error2");
return mv;
}
}
- 创建Controller:
@Controller
public class ErrorController {
@RequestMapping("show")
public String show() {
String str = null;
str.length();
// int a=3/0;
return "ok";
}
}
- 创建页面:
<body>
<h3 >操作失败!!!<span th:text="${error}"></span></h3>
</body>
4.通过SimpleMappingExceptionResolver对象处理异常:
实现全局异常处理。
- 创建全局异常处理类:
/**
* 全局异常
*/
@Configuration
public class GlobalException2 {
@Bean
public SimpleMappingExceptionResolver getSimpleMapping() {
SimpleMappingExceptionResolver ser = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
//参 数 一 : 异 常 类 型 , 并且是全名参 数 二:视图名称
properties.put("java.lang.NullPointerException", "error3");
properties.put("java.lang.ArithmeticException", "error4");
ser.setExceptionMappings(properties);
return ser;
}
}
5.通过自定义 HandlerExceptionResolver 对象处理异常:
实现自定义全局异常处理。
- 创建全局异常处理类:
@Configuration
public class GlobalException3 implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
//判断不同的异常类型
if (e instanceof NullPointerException){
mv.setViewName("error");
}if (e instanceof ArithmeticException){
mv.setViewName("error");
}
mv.addObject("error",e.toString());
return mv;
}
}
- 创建Controller:
@RequestMapping("show2")
public String show2() {
int a=3/0;
return "ok";
}
二、SpringBoot服务端数据校验
1.实现数据校验:
-
创建项目:
创建实体类并添加校验规则:
/**
* @NotNull:对 基 本 数 据 类 型 的 对 象 类 型 做 非 空 校 验
* @NotBlank: 对 字 符 串 类 型 做 非 空 校 验
* @NotEmpty: 对 集 合 类 型 做 非 空 校 验
*/
@NotNull(message = "{userid.notnull}")
private Integer userid;
@NotBlank(message = "{username.notnull}")
@Length(max = 10,min = 5,message = "用户名长度为5~10")
private String username;
@NotNull(message = "{userage.notnull}")
private Integer userage;
- 创建Controller并开启校验:
@Controller
@RequestMapping("user")
@Validated
public class UserController {
@RequestMapping("addUser")
public String addUser(@ModelAttribute("blur") @Validated Users users, BindingResult result) {
if (result.hasErrors()) {
// List<ObjectError> list = result.getAllErrors();
// for (ObjectError err:list) {
// FieldError fieldError = (FieldError)err;
// String field = fieldError.getField();
// String message = fieldError.getDefaultMessage();
// System.out.println(field+"----"+message);
// }
return "addUser";
}
System.out.println(users);
return "ok";
}
- 创建页面:
<body>
<form th:action="@{/user/addUser}" method="post">
<p>
用户名: <input type="text" name="username"/><font color="red" ><span th:errors="${blur.username}"></span></font>
</p>
<p>
年龄: <input type="text" name="userage"/><font color="red" th:errors="${blur.userage}"></font>
</p>
<p>
<input type="submit" value="添加"/>
</p>
</form>
</body>
- 自定义错误提示信息:
@NotNull(message = "用户ID不能为空")
private Integer userid;
@NotBlank(message = "用户姓名不能为空")
private String username;
@NotBlank(message = "用户性别不能为空"
private Integer userage;
-
在配置文件中定义提示信息:
userid.notnull=\u7528\u6237ID\u4e0d\u80fd\u4e3a\u7a7a-
username.notnull=\u7528\u6237\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a-
userage.notnull=\u7528\u6237\u5e74\u9f84\u4e0d\u80fd\u4e3a\u7a7a-
-
实现效果:
2.解决页面跳转异常:
在html中的获取result中的错误提示,获取的提示的名字和生成的实体类中的名字对应。
在跳转页面的方法中注入一个对象,要求参数对象的变量名必须是对象类型名称首字母 小写格式。
- 页面跳转异常:
@Controller
public class ShowPage {
/**
* 跳 转 页 面 方 法
* 解 决 异 常 的 方 式 : 可 以 在 跳 转 页 面 的 方 法 中 注 入 一 个 Users
* 对 象由 于 SprignMVC会 将 该 对 象 放 入 到 Model中 传 递 ,
* key的 名 称 会 使 用该 对 象的 驼 峰 命 名 规 则 来 作 为 key
*/
@RequestMapping("/{page}")
public String show(@PathVariable String page, @ModelAttribute("blur") Users users) {
System.out.println(page);
return page;
}
}
- 修改Key的名称:
使用@ModelAttribute注解,对注入的错误提示对象更改别名。
@ModelAttribute("blur") Users users
3.其他校验规则:
@NotNull: 判断基本数据类型的对象类型是否为 null
@NotBlank: 判断字符串是否为 null 或者是空串(去掉首尾空格)。
@NotEmpty: 判断集合是否为空。
@Length: 判断字符的长度(最大或者最小)
@Min: 判断数值最小值
@Max: 判断数值最大值
@Email: 判断邮箱是否合法
4.通过全局异常处理来跳转页面:
- 对参数指定校验规则:
@PostMapping("/findUser")
public String findUser(@NotBlank(message = "用户名不能为空") String username) {
System.out.println(username);
return "ok";
}
- 在Controller中开启校验:
@Controller
@RequestMapping("user")
@Validated
public class UserController {
- 通过全局异常处理:
@Configuration
public class Exceptions implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
//判断不同的异常类型
if (e instanceof NullPointerException){
mv.setViewName("error");
}if (e instanceof ArithmeticException){
mv.setViewName("error");
}if (e instanceof ConstraintViolationException){
mv.setViewName("findUser");
}
mv.addObject("error",e.getMessage().split(":")[1]);
return mv;
}
}
三、SpringBoot整合JUnit单元测试
SpringBoot2.x 使用 Junit5 作为测试平台,
- @RunWith注解的作用:
@RunWith就是一个运行器;
@RunWith(JUnit4.class)就是指用JUnit4来运行;
@RunWith(SpringJUnit4ClassRunner.class),让测试运行Spring测试环境;
@RunWith(Suite.class)的话就是一套测试集合;
- @SpringBootTest注解的作用:
使用@SpringBootTest注解可以运行环境,测试后台代码。
- 修改POM文件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!--junit-vintage-engine提 供 了 Junit3与 Junit4的 运行 平 台 -->
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
2.JUnit5:
- 测试代码:
public class JunitTest {
public static void JunitDemo(){
System.out.println("测试Junit!!!");
}
}
@SpringBootTest
class SpringbootSjunitApplicationTests {
@Test
void contextLoads() {
JunitTest.JunitDemo();
}
}
四、SpringBoot热部署
1.通过DevTools工具实现热部署:
- 修改POM文件,添加DevTools的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
-
配置IDEA设置自动编译:
- 设置IDEA的Registry:
通过快捷键打开该设置项:Ctrl+Shift+Alt+/ 勾选complier.automake.allow.when.app.running;