@ControllerAdvice 全域性異常響應頁面和 JSON
我這裡頁面以 Thymeleaf 為例子,相關配置:
spring:
thymeleaf:
cache: false
mode: HTML5
encoding: UTF-8
prefix: classpath:/templates/
判斷是否是 AJAX:
public static boolean isAjaxRequest(HttpServletRequest request) {
return request.getHeader("x-requested-with") != null;
}
異常攔截器:
/**
* @author Dongguabai
* @Description
* @Date 建立於 2020-12-02 10:43
*/
@ControllerAdvice
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
private static final String ERROR_PAGE = "error";
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Object handleException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Exception e) throws UnsupportedEncodingException {
if (isAjaxRequest(httpServletRequest)){
//這裡返回專案中自定義的統一響應物件即可
return json(e);
}
return view(e);
}
這裡返回專案中自定義的統一響應物件即可
private ResponseX json(Exception e) {
return new ResponseX();
}
//這裡返回 ModelAndView
public ModelAndView view(Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setStatus(HttpStatus.BAD_REQUEST);
modelAndView.setViewName(ERROR_PAGE);
modelAndView.addObject("msg","msg");
modelAndView.addObject("code","code");
return modelAndView;
}
}
error.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<head th:insert="fragments/header"/>
<title>error</title>
</head>
<body>
<span th:text="${code}" ></span> - <span th:text="${msg}" ></span>
</body>
</html>
這裡補充說明下,建議不要使用攔截器做,當然不是說攔截器不行(處理響應流即可),主要是攔截器其實是無法處理 Controller
中的異常的:
org.springframework.web.servlet.DispatcherServlet#triggerAfterCompletion
:
private void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler, Exception ex) throws Exception {
if (mappedHandler != null) {
mappedHandler.triggerAfterCompletion(request, response, ex);
}
throw ex;
}
相關文章
- 【SpringBoot】全域性異常處理@ControllerAdviceSpring BootController
- springboot 配置錯誤頁面及全域性異常Spring Boot
- springmvc高可用響應物件以及全域性異常處理類的編寫SpringMVC物件
- .netcore全域性異常處理NetCore
- wpf 捕獲全域性異常
- springboot全域性異常處理Spring Boot
- springboot下新增全域性異常處理和自定義異常處理Spring Boot
- springboot 全域性異常攔截器,友好異常提示Spring Boot
- NETCORE - 全域性異常處理(Exception)NetCoreException
- SpringBoot之全域性異常處理Spring Boot
- SpringBoot之全域性捕獲異常Spring Boot
- Spring-全域性異常攔截Spring
- dotNet8 全域性異常處理
- .NetCore——全域性異常過濾器ExceptionFilterAttributeNetCore過濾器ExceptionFilter
- SpringBoot中的全域性異常處理Spring Boot
- SpringBoot處理全域性統一異常Spring Boot
- Vue單頁及多頁應用全域性配置404頁面實踐Vue
- Spring Boot GraphQL 實戰 03_分頁、全域性異常處理和非同步載入Spring Boot非同步
- Spring @ControllerAdvice+@ExceptionHandler統一異常處理SpringControllerException
- SpringBoot優雅的全域性異常處理Spring Boot
- Spring Cloud Gateway的全域性異常處理SpringCloudGateway
- 移動端頁面和響應式
- 簡單的全域性異常統一處理
- spring-boot-route(四)全域性異常處理Springboot
- 設計一個全域性異常處理器
- Spring Boot 2 Webflux的全域性異常處理Spring BootWebUX
- 踩坑記:gRPC 異常響應RPC
- 實戰Spring Boot 2.0系列(二) - 全域性異常處理和測試Spring Boot
- 直播系統程式碼,小程式全域性分享和頁面分享
- Spring進階之@ControllerAdvice與統一異常處理SpringController
- spring boot配置跨域、全域性異常處理、page分頁配置、統一返回MessageResultSpring Boot跨域
- Feign失敗重試與全域性異常捕獲
- Django筆記三十一之全域性異常處理Django筆記
- SpringBoot進行優雅的全域性異常處理Spring Boot
- Vue3 如何實現全域性異常處理?Vue
- (系列六).net8 全域性異常捕獲機制
- gRPC伺服器中新增全域性異常攔截器RPC伺服器
- dingo + jwt 搭建後 handler 全域性接收異常的問題GoJWT