SpringBoot自定义错误信息,SpringBoot适配Ajax请求
SpringBoot自定义错误信息,SpringBoot自定义异常处理类,
SpringBoot异常结果处理适配页面及Ajax请求,
SpringBoot适配Ajax请求
================================
©Copyright 蕃薯耀 2018年3月29日
http://www.cnblogs.com/fanshuyao/
附件&源码下载见:http://fanshuyao.iteye.com/blog/2414865
一、自定义异常处理类:
- import java.util.HashMap;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import org.springframework.web.bind.annotation.ControllerAdvice;
- import org.springframework.web.bind.annotation.ExceptionHandler;
- import com.lqy.springboot.component.CustomErrorAttribute;
- @ControllerAdvice
- public class CustomExceptionHandler {
- /**
- * 自定义异常数据
- * 缺点,没有适配页面和Ajax请求,返回的数据都是json数据
- * @param req
- * @return
- */
- /*@ResponseBody
- @ExceptionHandler(Exception.class)
- public Map<String, Object> exceptionHandler(HttpServletRequest req){
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("errorCode", 500);
- map.put("errorMsg", "错误信息");
- map.put("errorSystem", "errorSystem");
- return map;
- }*/
- /**
- * 自定义异常数据
- * 适配页面和Ajax请求
- * 注解ExceptionHandler(Exception.class)的Exception.class可以替换成自己定义的错误异常类
- * @param req
- * @return
- */
- @ExceptionHandler(Exception.class)
- public String exceptionHandler(HttpServletRequest req){
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("errorCode", 500);
- map.put("errorMsg", "错误信息");
- map.put("errorSystem", "errorSystem");
- req.setAttribute(CustomErrorAttribute.CUSTOM_ERROR_MAP_NAME, map);
- //传入自己的错误代码,必须的,否则不会进入自定义错误页面,见:org.springframework.boot.autoconfigure.web.AbstractErrorController
- req.setAttribute("javax.servlet.error.status_code", 500);
- //转发到springBoot错误处理请求,能适配网页和Ajax的错误处理
- //请求/error后,会进入BasicErrorController(@RequestMapping("${server.error.path:${error.path:/error}}"))
- //页面的数据显示处理是使用:errorAttributes.getErrorAttributes获取显示的,是AbstractErrorController的方法
- //当需要把自己定义的Map错误信息传递到错误提示页面时,
- //可以编写一个自定义错误属性类处理:CustomErrorAttribute,继承DefaultErrorAttributes类,
- //重写getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace)方法
- return "forward:/error";
- }
- }
异常捕捉后请求转发到
- return "forward:/error";
是为了让SpringBoot底层处理,协助系统适配页面返回结果和Ajax返回结果:当是页面打开时,会跳转到相应的错误页面显示异常信息,当是Ajax请求或者使用工具请求时,返回的json字符串。(下面有图)
SpringBoot适配页面返回结果和Ajax返回结果的代码如下:
- @RequestMapping(produces = "text/html")
- public ModelAndView errorHtml(HttpServletRequest request,
- HttpServletResponse response) {
- HttpStatus status = getStatus(request);
- Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
- request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
- response.setStatus(status.value());
- ModelAndView modelAndView = resolveErrorView(request, response, status, model);
- return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
- }
- @RequestMapping
- @ResponseBody
- public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
- Map<String, Object> body = getErrorAttributes(request,
- isIncludeStackTrace(request, MediaType.ALL));
- HttpStatus status = getStatus(request);
- return new ResponseEntity<Map<String, Object>>(body, status);
- }
二、自定义异常信息传递类
- import java.util.Map;
- import org.springframework.boot.autoconfigure.web.DefaultErrorAttributes;
- import org.springframework.stereotype.Component;
- import org.springframework.web.context.request.RequestAttributes;
- @Component
- public class CustomErrorAttribute extends DefaultErrorAttributes {
- public static final String CUSTOM_ERROR_MAP_NAME = "customErrorMap";
- @Override
- public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
- Map<String, Object> map = super.getErrorAttributes(requestAttributes, includeStackTrace);
- //设置传递自己定义的错误信息
- map.put(CUSTOM_ERROR_MAP_NAME, requestAttributes.getAttribute(CUSTOM_ERROR_MAP_NAME, RequestAttributes.SCOPE_REQUEST));
- return map;
- }
- }
定义这个类,是为了传递自己想要显示的错误信息,例如在Controller发生错误时,想把某些特殊信息传到错误页面,就可以自定义一个异常信息处理类,传递自己的自定义错误信息,同时也兼容SpringBoot本身定义好的错误 信息。
三、页面显示异常信息
- <!DOCTYPE html>
- <html xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>500</title>
- </head>
- <body>
- <div>500错误</div>
- <div>path:[[${path}]]</div>
- <div>status:[[${status}]]</div>
- <div>timestamp:[[${#dates.format(timestamp, 'yyyy-MM-dd HH:mm:ss')}]]</div>
- <div>error:[[${error}]]</div>
- <div>exception:[[${exception}]]</div>
- <div>message:[[${message}]]</div>
- <div>errors:[[${errors}]]</div>
- <!-- 自定义属性 -->
- <div>customErrorMap.errorMsg:[[${customErrorMap.errorMsg}]]</div>
- <div>customErrorMap.errorSystem:[[${customErrorMap.errorSystem}]]</div>
- <div>customErrorMap.errorCode:[[${customErrorMap.errorCode}]]</div>
- </body>
- </html>
页面显示结果:

Post请求结果:

项目源码见附件:SpringBoot-自定义错误.zip
======SpringBoot自定义错误页面见:======
SpringBoot自定义错误页面,SpringBoot 404、500错误提示页面
SpringBoot 4xx.html、5xx.html错误提示页面
http://www.cnblogs.com/fanshuyao/p/8668072.html
================================
©Copyright 蕃薯耀 2018年3月29日
http://www.cnblogs.com/fanshuyao/
SpringBoot自定义错误信息,SpringBoot适配Ajax请求的更多相关文章
- SpringBoot自定义错误页面,SpringBoot 404、500错误提示页面
SpringBoot自定义错误页面,SpringBoot 404.500错误提示页面 SpringBoot 4xx.html.5xx.html错误提示页面 ====================== ...
- springboot自定义错误页面
springboot自定义错误页面 1.加入配置: @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { re ...
- 自定义错误信息并写入到Elmah
在ap.net Web项目中一直使用Elmah进行日志记录, 但一直有一个问题困扰我很久,那就是我如何自己生成一个错误并记录到Elmah里去. 你知道有时你需要在项目中生成一个错误用于一些特殊的需求 ...
- 自定义 ocelot 中间件输出自定义错误信息
自定义 ocelot 中间件输出自定义错误信息 Intro ocelot 中默认的 Response 中间件在出错的时候只会设置 StatusCode 没有具体的信息,想要展示自己定义的错误信息的时候 ...
- 前端:参数传错了,spring-boot:那错误信息我给你显示的友好点儿
之前两篇文章 Spring-boot自定义参数校验注解和如何在spring-boot中进行参数校验,我们介绍了,参数校验以及如何自定义参数校验注解,但是当传递参数出错时,只是把错误信息打印到了控制台, ...
- ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误
今天我们的项目遇到问题 为了避免跨站点脚本攻击, 默认我们项目是启用了 validateRequest,这也是 ASP.NET 的默认验证规则.项目发布后,如果 customError 启用了,则会显 ...
- Springboot - 自定义错误页面
Springboot 没找到页面或内部错误时,会访问默认错误页面.这节我们来自定义错误页面. 自定义错误页面 1.在resources 目录下面再建一个 resources 文件夹,里面建一个 err ...
- springboot自定义错误页面(转)
方法一:Spring Boot 将所有的错误默认映射到/error, 实现ErrorController @Controller @RequestMapping(value = "error ...
- jquery.validate使用 - 自定义错误信息
自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...
随机推荐
- ASP.NET 多次点击button后事件执行多次 并发解决 频繁操作解决办法
首先让我们体验一下频繁操作: 1)打开项目,在后台aspx.cs等服务器页面,设置断点. 2)点击页面按钮 3)调试开始进入断点,然后重复点击页面按钮 4)服务器第一次事件已经处理完毕,调试再次进入了 ...
- 理解 .NET 2015
去年跟着BUILD之后,我发了一篇文章Exciting Times for .NET 并从那以后我已经很荣幸地能够与.NET团队并肩作战,这其中包括了运行时.框架.语言和编译器.虽然去年我的重心已经更 ...
- PHP7通过yum源安装及性能测试
提到PHP,肯定会有人说这是世界上最好的编程语言.单说流行程度,目前全球超过81.7%的服务器后端都采用了PHP语言,它驱动着全球超过2亿多个网站.上月初PHP7正式版发布,迎来自2004年以来最大的 ...
- SpringCloud服务如何在Eureka安全优雅的下线
如果直接KILL SpringCloud的服务,因为Eureka采用心跳的机制来上下线服务,会导致服务消费者调用此已经kill的服务提供者然后出错,处理这种情况有2中方案. 如需平滑的发布服务请参考: ...
- WCF兼容WebAPI输出Json格式数据,从此WCF一举两得
问题起源: 很多时候为了业务层调用(后台代码),一些公共服务就独立成了WCF,使用起来非常方便,添加服务引用,然后简单配置就可以调用了. 如果这个时候Web站点页面需要调用怎么办呢? 复杂的XML , ...
- 合理设置apache httpd的最大连接数
来自:http://hi.baidu.com/rainchen/blog/item/095f0a551fa802c5b645ae46.html 手头有一个网站在线人数增多,访问时很慢.初步认为是服务器 ...
- 有关volatile关键字和transient关键字
(1)volatile关键字['vɑlətl]的作用 让变量每次在使用的时候,都从主存中取,而不是从各个线程的“工作内存”. 也就是说,volatile变量对于每次使用,线程都能得到当前volatil ...
- HTML Entity 字符实体(字符转义)
目录 1. HTML Entity 2. 字符与Entity Name的互相转换 3. 字符与Entity Number的互相转换 1. HTML Entity 1.1 介绍 在编写HTML页面时,需 ...
- Nginx 配置TCP代理
Nginx 1.9 版本以后增加了stream模块,可以对tcp,udp请求进行代理和负载均衡了,今天来体验一下首先编译安装过程configure的时候增加选项 --with-stream --wit ...
- 转发-基于ASP.NET MVC 4/5 Razor的模块化/插件式架构实现
基于ASP.NET MVC 4/5 Razor的模块化/插件式架构实现 概述 在日常开发中, 我们经常谈起模块化/插件化架构,这样可既可以提高开效率,又可以实现良好的扩展性,尤其对于产品化的系统有 ...