SpringBoot自定义错误信息,SpringBoot自定义异常处理类,

SpringBoot异常结果处理适配页面及Ajax请求,

SpringBoot适配Ajax请求

================================

©Copyright 蕃薯耀 2018年3月29日

http://www.cnblogs.com/fanshuyao/

附件&源码下载见:http://fanshuyao.iteye.com/blog/2414865

一、自定义异常处理类:

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. import javax.servlet.http.HttpServletRequest;
  4. import org.springframework.web.bind.annotation.ControllerAdvice;
  5. import org.springframework.web.bind.annotation.ExceptionHandler;
  6. import com.lqy.springboot.component.CustomErrorAttribute;
  7. @ControllerAdvice
  8. public class CustomExceptionHandler {
  9. /**
  10. * 自定义异常数据
  11. * 缺点,没有适配页面和Ajax请求,返回的数据都是json数据
  12. * @param req
  13. * @return
  14. */
  15. /*@ResponseBody
  16. @ExceptionHandler(Exception.class)
  17. public Map<String, Object> exceptionHandler(HttpServletRequest req){
  18. Map<String, Object> map = new HashMap<String, Object>();
  19. map.put("errorCode", 500);
  20. map.put("errorMsg", "错误信息");
  21. map.put("errorSystem", "errorSystem");
  22. return map;
  23. }*/
  24. /**
  25. * 自定义异常数据
  26. * 适配页面和Ajax请求
  27. * 注解ExceptionHandler(Exception.class)的Exception.class可以替换成自己定义的错误异常类
  28. * @param req
  29. * @return
  30. */
  31. @ExceptionHandler(Exception.class)
  32. public String exceptionHandler(HttpServletRequest req){
  33. Map<String, Object> map = new HashMap<String, Object>();
  34. map.put("errorCode", 500);
  35. map.put("errorMsg", "错误信息");
  36. map.put("errorSystem", "errorSystem");
  37. req.setAttribute(CustomErrorAttribute.CUSTOM_ERROR_MAP_NAME, map);
  38. //传入自己的错误代码,必须的,否则不会进入自定义错误页面,见:org.springframework.boot.autoconfigure.web.AbstractErrorController
  39. req.setAttribute("javax.servlet.error.status_code", 500);
  40. //转发到springBoot错误处理请求,能适配网页和Ajax的错误处理
  41. //请求/error后,会进入BasicErrorController(@RequestMapping("${server.error.path:${error.path:/error}}"))
  42. //页面的数据显示处理是使用:errorAttributes.getErrorAttributes获取显示的,是AbstractErrorController的方法
  43. //当需要把自己定义的Map错误信息传递到错误提示页面时,
  44. //可以编写一个自定义错误属性类处理:CustomErrorAttribute,继承DefaultErrorAttributes类,
  45. //重写getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace)方法
  46. return "forward:/error";
  47. }
  48. }

异常捕捉后请求转发到

  1. return "forward:/error";

是为了让SpringBoot底层处理,协助系统适配页面返回结果和Ajax返回结果:当是页面打开时,会跳转到相应的错误页面显示异常信息,当是Ajax请求或者使用工具请求时,返回的json字符串。(下面有图)

SpringBoot适配页面返回结果和Ajax返回结果的代码如下:

  1. @RequestMapping(produces = "text/html")
  2. public ModelAndView errorHtml(HttpServletRequest request,
  3. HttpServletResponse response) {
  4. HttpStatus status = getStatus(request);
  5. Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(
  6. request, isIncludeStackTrace(request, MediaType.TEXT_HTML)));
  7. response.setStatus(status.value());
  8. ModelAndView modelAndView = resolveErrorView(request, response, status, model);
  9. return (modelAndView == null ? new ModelAndView("error", model) : modelAndView);
  10. }
  11. @RequestMapping
  12. @ResponseBody
  13. public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
  14. Map<String, Object> body = getErrorAttributes(request,
  15. isIncludeStackTrace(request, MediaType.ALL));
  16. HttpStatus status = getStatus(request);
  17. return new ResponseEntity<Map<String, Object>>(body, status);
  18. }

二、自定义异常信息传递类

  1. import java.util.Map;
  2. import org.springframework.boot.autoconfigure.web.DefaultErrorAttributes;
  3. import org.springframework.stereotype.Component;
  4. import org.springframework.web.context.request.RequestAttributes;
  5. @Component
  6. public class CustomErrorAttribute extends DefaultErrorAttributes {
  7. public static final String CUSTOM_ERROR_MAP_NAME = "customErrorMap";
  8. @Override
  9. public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {
  10. Map<String, Object> map = super.getErrorAttributes(requestAttributes, includeStackTrace);
  11. //设置传递自己定义的错误信息
  12. map.put(CUSTOM_ERROR_MAP_NAME, requestAttributes.getAttribute(CUSTOM_ERROR_MAP_NAME, RequestAttributes.SCOPE_REQUEST));
  13. return map;
  14. }
  15. }

定义这个类,是为了传递自己想要显示的错误信息,例如在Controller发生错误时,想把某些特殊信息传到错误页面,就可以自定义一个异常信息处理类,传递自己的自定义错误信息,同时也兼容SpringBoot本身定义好的错误 信息。

三、页面显示异常信息

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>500</title>
  6. </head>
  7. <body>
  8. <div>500错误</div>
  9. <div>path:[[${path}]]</div>
  10. <div>status:[[${status}]]</div>
  11. <div>timestamp:[[${#dates.format(timestamp, 'yyyy-MM-dd HH:mm:ss')}]]</div>
  12. <div>error:[[${error}]]</div>
  13. <div>exception:[[${exception}]]</div>
  14. <div>message:[[${message}]]</div>
  15. <div>errors:[[${errors}]]</div>
  16. <!-- 自定义属性 -->
  17. <div>customErrorMap.errorMsg:[[${customErrorMap.errorMsg}]]</div>
  18. <div>customErrorMap.errorSystem:[[${customErrorMap.errorSystem}]]</div>
  19. <div>customErrorMap.errorCode:[[${customErrorMap.errorCode}]]</div>
  20. </body>
  21. </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请求的更多相关文章

  1. SpringBoot自定义错误页面,SpringBoot 404、500错误提示页面

    SpringBoot自定义错误页面,SpringBoot 404.500错误提示页面 SpringBoot 4xx.html.5xx.html错误提示页面 ====================== ...

  2. springboot自定义错误页面

    springboot自定义错误页面 1.加入配置: @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { re ...

  3. 自定义错误信息并写入到Elmah

    在ap.net Web项目中一直使用Elmah进行日志记录, 但一直有一个问题困扰我很久,那就是我如何自己生成一个错误并记录到Elmah里去. 你知道有时你需要在项目中生成一个错误用于一些特殊的需求 ...

  4. 自定义 ocelot 中间件输出自定义错误信息

    自定义 ocelot 中间件输出自定义错误信息 Intro ocelot 中默认的 Response 中间件在出错的时候只会设置 StatusCode 没有具体的信息,想要展示自己定义的错误信息的时候 ...

  5. 前端:参数传错了,spring-boot:那错误信息我给你显示的友好点儿

    之前两篇文章 Spring-boot自定义参数校验注解和如何在spring-boot中进行参数校验,我们介绍了,参数校验以及如何自定义参数校验注解,但是当传递参数出错时,只是把错误信息打印到了控制台, ...

  6. ASP.NET MVC 中如何用自定义 Handler 来处理来自 AJAX 请求的 HttpRequestValidationException 错误

    今天我们的项目遇到问题 为了避免跨站点脚本攻击, 默认我们项目是启用了 validateRequest,这也是 ASP.NET 的默认验证规则.项目发布后,如果 customError 启用了,则会显 ...

  7. Springboot - 自定义错误页面

    Springboot 没找到页面或内部错误时,会访问默认错误页面.这节我们来自定义错误页面. 自定义错误页面 1.在resources 目录下面再建一个 resources 文件夹,里面建一个 err ...

  8. springboot自定义错误页面(转)

    方法一:Spring Boot 将所有的错误默认映射到/error, 实现ErrorController @Controller @RequestMapping(value = "error ...

  9. jquery.validate使用 - 自定义错误信息

    自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...

随机推荐

  1. ASP.NET 多次点击button后事件执行多次 并发解决 频繁操作解决办法

    首先让我们体验一下频繁操作: 1)打开项目,在后台aspx.cs等服务器页面,设置断点. 2)点击页面按钮 3)调试开始进入断点,然后重复点击页面按钮 4)服务器第一次事件已经处理完毕,调试再次进入了 ...

  2. 理解 .NET 2015

    去年跟着BUILD之后,我发了一篇文章Exciting Times for .NET 并从那以后我已经很荣幸地能够与.NET团队并肩作战,这其中包括了运行时.框架.语言和编译器.虽然去年我的重心已经更 ...

  3. PHP7通过yum源安装及性能测试

    提到PHP,肯定会有人说这是世界上最好的编程语言.单说流行程度,目前全球超过81.7%的服务器后端都采用了PHP语言,它驱动着全球超过2亿多个网站.上月初PHP7正式版发布,迎来自2004年以来最大的 ...

  4. SpringCloud服务如何在Eureka安全优雅的下线

    如果直接KILL SpringCloud的服务,因为Eureka采用心跳的机制来上下线服务,会导致服务消费者调用此已经kill的服务提供者然后出错,处理这种情况有2中方案. 如需平滑的发布服务请参考: ...

  5. WCF兼容WebAPI输出Json格式数据,从此WCF一举两得

    问题起源: 很多时候为了业务层调用(后台代码),一些公共服务就独立成了WCF,使用起来非常方便,添加服务引用,然后简单配置就可以调用了. 如果这个时候Web站点页面需要调用怎么办呢? 复杂的XML , ...

  6. 合理设置apache httpd的最大连接数

    来自:http://hi.baidu.com/rainchen/blog/item/095f0a551fa802c5b645ae46.html 手头有一个网站在线人数增多,访问时很慢.初步认为是服务器 ...

  7. 有关volatile关键字和transient关键字

    (1)volatile关键字['vɑlətl]的作用 让变量每次在使用的时候,都从主存中取,而不是从各个线程的“工作内存”. 也就是说,volatile变量对于每次使用,线程都能得到当前volatil ...

  8. HTML Entity 字符实体(字符转义)

    目录 1. HTML Entity 2. 字符与Entity Name的互相转换 3. 字符与Entity Number的互相转换 1. HTML Entity 1.1 介绍 在编写HTML页面时,需 ...

  9. Nginx 配置TCP代理

    Nginx 1.9 版本以后增加了stream模块,可以对tcp,udp请求进行代理和负载均衡了,今天来体验一下首先编译安装过程configure的时候增加选项 --with-stream --wit ...

  10. 转发-基于ASP.NET MVC 4/5 Razor的模块化/插件式架构实现

    基于ASP.NET MVC 4/5 Razor的模块化/插件式架构实现   概述 在日常开发中, 我们经常谈起模块化/插件化架构,这样可既可以提高开效率,又可以实现良好的扩展性,尤其对于产品化的系统有 ...