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/