zoukankan      html  css  js  c++  java
  • SpringBoot自定义错误信息,SpringBoot适配Ajax请求

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

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

    SpringBoot适配Ajax请求

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

    ©Copyright 蕃薯耀 2018年3月29日

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

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

    一、自定义异常处理类:

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

    异常捕捉后请求转发到

    Java代码  收藏代码
    1. return "forward:/error";  

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

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

    Java代码  收藏代码
    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.   
    12.     @RequestMapping  
    13.     @ResponseBody  
    14.     public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {  
    15.         Map<String, Object> body = getErrorAttributes(request,  
    16.                 isIncludeStackTrace(request, MediaType.ALL));  
    17.         HttpStatus status = getStatus(request);  
    18.         return new ResponseEntity<Map<String, Object>>(body, status);  
    19.     }  

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

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

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

    三、页面显示异常信息

    Html代码  收藏代码
    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/

  • 相关阅读:
    美国保健品排行榜
    美国海淘购物入门
    美国保健品品牌介绍之Now Foods
    haitaolab.com 我的新网站,欢迎访问
    PTC点击网赚入门
    信用卡基础知识
    12月购物10%-12%积分返还
    java界面设计(swing)
    c语言中阶乘的精确值
    java中Map集合的理解
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/8668376.html
Copyright © 2011-2022 走看看