本示例使用Spring Boot 1.5.9.RELEASE。
在Spring Boot当中,当发生异常或者错误时默认会有 “org.springframework.boot.autoconfigure.web.BasicErrorController” 来进行处理,通过查看源码会发现Spring Boot在发生错误时对于不同的请求方式会有不同的返回内容。
1. 根据状态码显示
当使用浏览器来访问一个不存在的请求时,会返回如下错误页面:
但是如果使用像Postman这样的工具来访问时候则会返回json格式的数据:
在普通的web项目中,可以通过在web.xml中去配置像404,500这样状态码的页面,那么在Spring Boot中,只需要在resources下面创建”public/error/**” 相对应的页面即可,如果用使用模板引擎,则在”templates/error/xx.html”如:
再次使用浏览器去访问不存在请求时,就会指向我们自定义的页面:
2. 异常的处理
Spring MVC相关:
Spring MVC Exception Handler 异常的处理
Spring Boot对于异常的处理与Spring MVC类似。
在静态配置不同状态码的页面,往往有时不能满足我们的需要,我们需要通过一定的逻辑来处理,比如返回同一格式的json数据,这个主要通过”org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer“来自定义对应的映射。
首先设置需要处理的状态码和相关的映射路径:
CustomConfig.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package com.devnp.springbootexceptionhandlerdemo.config;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; import org.springframework.boot.web.servlet.ErrorPage; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration public class CustomConfig extends WebMvcConfigurerAdapter{
@Bean public EmbeddedServletContainerCustomizer containerCustomizer() {
return (container -> { ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/404"); ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500");
container.addErrorPages(error404Page, error500Page); }); } }
|
其次编写映射的控制器(Controller):
StatusController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.devnp.springbootexceptionhandlerdemo.web;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
@RestController public class StatusController { @RequestMapping("/404") public String status404() { return "This is Custom 404 " ; } @RequestMapping("/500") public String status500() { return "This is Custom 500" ; }
}
|
这样在发生对应的状态码,就会请求到相关的控制器:
产生异常时
通过上面的方法,可以用来处理当服务器发生错误状态码为500的处理,但是如果想要知道这个异常的产生是怎样的异常了?就通过”@ControllerAdvice“ 加 “@ExceptionHandler“来完成。
异常产生控制器:
BasicController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.devnp.springbootexceptionhandlerdemo.web;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
@RestController public class BasicController { @RequestMapping("/basicerror") public void basicError() throws Exception { throw new Exception("Basic Error."); } }
|
异常处理控制器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
package com.devnp.springbootexceptionhandlerdemo.web;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice public class ExceptionController {
@ExceptionHandler(value = Exception.class) @ResponseBody public String exceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception e){ return e.getMessage(); } }
|
访问产生异常的URL:http://localhost:8080/basicerror
注: 自定义异常的处理在返回状态码之前
代码下载
spring-boot-exception-handler-demo.zip
Author:
Darren Du
License:
Copyright (c) 2019 MIT LICENSE