当我们开发spring web应用程序时,对于如 IOException , ClassNotFoundException 之类的检查异常,往往编译器会提示程序员采用 try-catch 进行显式捕获,而对于像 ClassCastException , NullPointerException 这类非检查异常,编译器是不会提示你了,这往往也是能体现程序员代码编写能力的一个方面。
在spring web特别是spring-boot应用中,当一个请求调用成功时,一般情况下会返回 json 格式的对象,就像下面图所示:
但如果请求抛出了一个 RuntimeException 呢?如果我们不做处理,再次调用时将出现下面的页面:
也就是说当调用出现错误时,spring-boot默认会将请求映射到 /error 路径中去,如果没有相应的路径请求处理器,那么就会返回上面的 Whitelabel 错误页面。
1、自定义错误处理页面
当然对运行时异常不做处理是不可能的啦!通常的做法是自定义统一错误页面,然后返回。按照上面的思路,我们实现一个请求路径为 /error 的控制器,控制器返回一个资源路径地址,定义请求映射路径为 /error 的控制器并实现 ErrorController 接口,代码如下:
MyErrorPageController
package com.example.demo.controller.handler.errorpage;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* The class MyErrorPageController.
*
* Description:自定义错误页面
*
* @author: huangjiawei
* @since: 2018年6月13日
* @version: $Revision$ $Date$ $LastChangedBy$
*
*/
@Controller
public class MyErrorPageController implements ErrorController {
@RequestMapping("/error")
public String handleError() {
return "error.html"; // 该资源位于resources/static目录下
}
@Override
public String getErrorPath() {
return null;
}
}
然后在 reosurces/static 目录下建立 error.html 文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>这是个错误页面!存放在resources/static目录下,spring-boot发生错误时默认调用</h1>
</body>
</html>
再次请求 http://localhost:7000/demo/getUserInfoWithNoHandler.json ,如下:
2、使用 @ControllerAdvice 、 @ResponseBody 、 @ExceptionHandler 统一处理异常
在spring中可以使用上面3个注解进行统一异常处理,默认情况下我们可以针对系统中出现的某种类型的异常定义一个统一的处理器handler,比如说系统抛出了一个 NullPointerException ,那么我们可以定义一个专门针对 NullPointerException 的处理器,代码如下:
getUserInfoWithNullPointerException 接口
/**
* 测试空指针错误的处理
* @return
* @throws NullPointerException
*/
@RequestMapping(value = "getUserInfoWithNullPointerException.json", method = RequestMethod.GET)
public Student getUserInfoWithNullPointerException() throws NullPointerException {
throw new NullPointerException();
}
NullPointerExceptionHandler.java
package com.example.demo.controller.handler;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import com.example.demo.pojo.ErrorReturn;
/**
*
* The class NullPointerExceptionHandler.
*
* Description:处理空指针
*
* @author: huangjiawei
* @since: 2018年6月13日
* @version: $Revision$ $Date$ $LastChangedBy$
*
*/
@ControllerAdvice
public class NullPointerExceptionHandler {
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public ErrorReturn dealNullPointerException() {
e.printStackTrace();
ErrorReturn error = new ErrorReturn();
error.setReturnCode("-1");
error.setDesc("出现空指针异常啦!");
return error;
}
}
浏览器执行: http://localhost:7000/demo/getUserInfoWithNullPointerException.json
zKzKKXZ[yN[[ZHNynYNybW6WF6[[{nK |