如何配置springboot错误页,配置全局异常
1、错误页绝对是所有的web项目之中必须具有的一项信息显示处理,但是在传统的web项目开发之中,错误页都是在web.xml文件之中进行配置的,不过遗憾的时候springboot之中并不存在web.xml配置文件这一项,那么如果要想进行错误页的处理,最好的做法是需要根据每一个错误代码创建一个属于自己的错误显示页。
1、所有的错误页都是普通的静态文件,那么建议在"src/main/view/static"目录下创建几个常见的错误页(常见的错误的HTTP返回编码:404、500).

2、添加一个错误页的配置类,在启动类中的子包下建立:
package com.gwolf.config;
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.web.servlet.ErrorPage;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
@Configuration
public class ErrorPageConfig {
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST,"/error-400.html");
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND,"/error-404.html");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/error-500.html");
configurableEmbeddedServletContainer.addErrorPages(errorPage400,errorPage404,errorPage500);
}
};
}
}

3、那么此时只要出现了错误,就会找到相应的http状态码,而后跳转到指定的错误路径上进行显示。

4、下面首先来观察一个程序代码,例如:现在建立一个控制器,而后这个控制器抛出一个异常。
package com.gwolf.controller;
import com.gwolf.util.controller.AbstractBaseController;
import com.gwolf.vo.Member;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.validation.Valid;
import java.util.Iterator;
@Controller
public class MemberController extends AbstractBaseController{
@RequestMapping(value="/get", method = RequestMethod.GET)
@ResponseBody
public String get() {
System.out.println("除法计算:" + 10/0);
return "hello world";
}
@RequestMapping(value="/member_add_pre", method = RequestMethod.GET)
public String memberAddPre() {
return "member_add";
}
@RequestMapping(value="/member_add", method = RequestMethod.POST)
@ResponseBody
public Object memberAdd(@Valid Member member, BindingResult result) {
if(result.hasErrors()) {
Iterator<ObjectError> iterator = result.getAllErrors().iterator();
while (iterator.hasNext()) {
ObjectError objectError = iterator.next();
System.out.println("[错误信息]" + objectError.getCode() + ","
+ objectError.getDefaultMessage());
}
return result.getAllErrors();
} else {
return member;
}
}
}

5、如果此时配置有错误页,那么这个时候错误会同意跳转到500所在的路径下进行错误的显示,但是如果说现在希望能够显示出错误更加详细的内容呢?

6、所以这个时候可以单独定义一个页面进行错误的显示处理,而这个页面可以定义在"src/main/view/templates/error.html"。这个页面里面要求可以输出一些信息:
定义一个全局的异常处理类:
package com.gwolf.advice;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice //作为一个控制层的切面处理
public class GlobalExceptionHandler {
//定义错误显示页,error.html
public static final String DEFAULT_ERROR_VIEW="error";
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest request,Exception e) {
ModelAndView modelAndView = new ModelAndView(DEFAULT_ERROR_VIEW);
modelAndView.addObject("exceptionObject",e);
modelAndView.addObject("url",request.getRequestURL());
return modelAndView;
}
}

7、定义error.html页面:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>SpringBoot模板渲染</title>
<meta http-equiv="content-type"
content="text/html;charset=UTF-8" />
</head>
<body>
<p th:text="${url}" />
<p th:text="${exception.message}" />
</body>
</html>


8、对于全局异常信息显示除了采用以上的跳转处理方式之外,也可以做的简单一些,使用Rest进行显示:
package com.gwolf.advice;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@RestControllerAdvice //作为一个控制层的切面处理
public class GlobalExceptionHandler {
//定义错误显示页,error.html
public static final String DEFAULT_ERROR_VIEW="error";
@ExceptionHandler(value = Exception.class)
public Object defaultErrorHandler(HttpServletRequest request,Exception e) {
class ErrorInfo {
private Integer code;
private String message;
private String url;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
ErrorInfo info = new ErrorInfo();
info.setCode(100);
info.setMessage(e.getMessage());
info.setUrl(request.getRequestURL().toString());
return info;
}
}
