错误页绝对是所有的 WEB 项目之中必须具有的一项信息显示处理,但是在传统的 WEB 项目开发过程之中,错误页都是在web.xml 文件之中进行配置的,不过遗憾的是 SpringBoot 之中并不存在有 web.xml 配置文件这一项,那么如果要想进行错误页的处理,最好的做法是需要根据每一个错误代码创建一个属于自己的错误显示页。
1、 所有的错误页都是普通的静态文件,那么建议在“src/main/view/static”目录下创建几个常见的错误页(常见的错误的 HTTP返回编码:404、500、400)
添加一个错误页的配置类,在启动类中编写一个错误页的配置项;
package cn.test.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.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; /** * Created by SJ217110601 on 2018/2/6. */ @Configuration public class ErrprPageConfig { @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize( ConfigurableEmbeddedServletContainer container) { 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"); container.addErrorPages(errorPage400, errorPage404, errorPage500); } }; } }这个类呢是Springboot处理异常类的
EmbeddedServletContainerCustomizer
---------------------------------------------------------------华丽的分割线-----------------------------------
第二种方式:
定义一个全局异常处理类:
package cn.test.advice; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.ModelAndView; @ControllerAdvice // 作为一个控制层的切面处理 public class GlobalExceptionHandler { public static final String DEFAULT_ERROR_VIEW = "error"; // 定义错误显示页,error.html @ExceptionHandler(Exception.class) // 所有的异常都是Exception子类 public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception e) { // 出现异常之后会跳转到此方法 ModelAndView mav = new ModelAndView(DEFAULT_ERROR_VIEW); // 设置跳转路径 mav.addObject("exception", e); // 将异常对象传递过去 mav.addObject("url", request.getRequestURL()); // 获得请求的路径 return mav; } }
处理类error页面
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title></title> <link rel="icon" type="image/x-icon" href="/images/mldn.ico"/> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/> </head> <body> <p th:text="${url}"/> <p th:text="${exception.message}"/> </body> </html>返回结果:
http://localhost:8080/get
/ by zero
这样就知道路劲上,和错误信息对于全局异常信息显示除了采用以上的跳转处理方式之外,也可以做的简单一些,使用 Rest 进行显示。
范例:修改全局异常处理类
@RestControllerAdvice public class GlobalExceptionHandler { public static final String DEFAULT_ERROR_VIEW = "error"; // 定义错误显示页,error.html @ExceptionHandler(Exception.class) // 所有的异常都是Exception子类 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 ; }这样我们返回的效果就是这样的:
JSON
ok结束