springboot异常处理-自定义错误页面
SpringBoot默认的处理异常机制:一旦程序中出现了异常,springboot会向
/error
的url发送请求。在springboot中提供了一个名为BasicExceptionController
来处理/error
的请求,将错误信息进行收集,跳转到默认显示异常的页面。
- 将所有的异常跳转到同一个自定义异常页面。
- 在
templates
目录下新建一个名为error.html
的页面,必须叫error
。
在这里可以通过
exception
的key获取到错误信息。
<body>
出错了,请于管理员联系!
<span th:text="${exception }"></span>
</body>
- controller
@Controller
public class DemoController {
@RequestMapping("/show")
public String showPage() {
String str = null;
str.length();
return "index";
}
@RequestMapping("/show2")
public String showPage2() {
int a = 10/0;
return "index";
}
}
- pom文件
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<!-- spring-boot启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
- 缺点:不能根据不同错误跳转不同页面,只能跳转同一个页面。
springboot异常处理-@ExceptionHandler
创建一个返回值为
ModelAndView
的controller,使用注解@ExceptionHandler
进行异常处理。
- pom文件
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<dependencies>
<!-- spring-boot启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- thymeleaf启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
- 控制器
@Controller
public class DemoController {
/**
* java.lang.NullPointerException
*/
@RequestMapping("/show")
public String showPage() {
String str = null;
str.length();
return "index";
}
/**
* java.lang.ArithmeticException
*/
@RequestMapping("/show2")
public String showPage2() {
int a = 10/0;
return "index";
}
/**
* 该方法返回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是因为:用来封装异常信息以及视图的指定。
* 参数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;
}
}
- 新建页面
error1:处理
java.lang.ArithmeticException
异常;
error2:处理java.lang.NullPointerException
异常;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>error1-错误提示页面-ArithmeticException</title>
</head>
<body>
出错了,请于管理员联系!
<span th:text="${error }"></span>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>error2-错误提示页面-NullPointerException</title>
</head>
<body>
出错了,请于管理员联系!
<span th:text="${error }"></span>
</body>
</html>
- 缺点:当需要处理的异常数量多时,需要写多个控制器方法或者进行异常类型的判断处理,且不具备跨controller的能力,会造成代码的冗余。
springboot异常处理-@ControllerAdvice+@ExceptionHandler
该方式进行处理异常时,可以对所有的controller起作用,很大程度上减少了代码冗余。
- pom文件,同上。
- 新建全局Exception类。如
com.x.exception.GolbalException
。
1、
@ControllerAdvice
注解标记该类;
2、将之前@ExceptionHandler
标记的异常处理的controller方法放入该类。
3、此后所有的controller类出现该类中的异常时,会根据该类中的方法进行处理。
@ControllerAdvice
public class GolbalException {
/**
* 该方法返回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是因为:用来封装异常信息以及视图的指定。
* 参数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;
}
}
- 新建两个controller进行测试。
DemoController和DemoController2。
@Controller
public class DemoController {
/**
* java.lang.NullPointerException
*/
@RequestMapping("/show1")
public String showPage() {
String str = null;
str.length();
return "index";
}
/**
* java.lang.ArithmeticException
*/
@RequestMapping("/show2")
public String showPage2() {
int a = 10/0;
return "index";
}
}
@Controller
public class DemoController2 {
/**
* java.lang.NullPointerException
*/
@RequestMapping("/show3")
public String showPage() {
String str = null;
str.length();
return "index";
}
/**
* java.lang.ArithmeticException
*/
@RequestMapping("/show4")
public String showPage2() {
int a = 10/0;
return "index";
}
}
- 页面:
error1:处理
java.lang.ArithmeticException
异常;
error2:处理java.lang.NullPointerException
异常;
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>error1-错误提示页面-ArithmeticException</title>
</head>
<body>
出错了,请于管理员联系!
<span th:text="${error }"></span>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>error2-错误提示页面-NullPointerException</title>
</head>
<body>
出错了,请于管理员联系!
<span th:text="${error }"></span>
</body>
</html>
springboot异常处理-配置类:SimpleMappingExceptionResolver
1、对上一种方式
@ControllerAdvice+@ExceptionHandler
的简化。
2、 使用@Configuration
和@Bean
注解实现。
- pom文件,同上;
- controller,同上;
- 全局异常类,如
com.x.exception.GolbalException
。
/**
* @Configuration作用:
* springboot在启动时会对该类进行加载,该类中凡是有@Bean注解的都会被加载。
*/
@Configuration
public class GolbalException {
/**
* 该方法返回值类型必须是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");
//将视图和异常映射对象传递给SimpleMappingExceptionResolver
resolver.setExceptionMappings(mappings);
return resolver;
}
}
-
页面,同上。
-
缺点:同第三种方式相比,该方式只是做了视图的映射,但无法返回异常对象,也就是在页面中不能通过
<span th:text="${error }"></span>
获取异常信息。
springboot异常处理-自定义HandlerExceptionResolver
1、对第四种的优化,可以返回异常对象。
2、通过@Configuration
和HandlerExceptionResolver
接口实现。
- pom文件,同上。
- controller,同上。
- 全局异常类,如
com.x.exception.GolbalException
。
/**
* @Configuration作用:
* springboot在启动时会对该类进行加载,该类中凡是有@Bean注解的都会被加载。
*/
@Configuration
public class GolbalException implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
Exception e) {
ModelAndView mv = new ModelAndView();
if(e instanceof NullPointerException) {
mv.setViewName("error2");
}
if(e instanceof ArithmeticException) {
mv.setViewName("error1");
}
mv.addObject("error", e.toString());
return mv;
}
}
- 页面,同上。