本示例使用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;

/**
* @author duliu
*
*/
@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;

/**
* @author duliu
*
*/
@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;

/**
* @author duliu
*
*/
@ControllerAdvice
public class ExceptionController {

/**
* 全局异常
* @return
*/
@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