日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring MVC之异常处理

發布時間:2025/4/16 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring MVC之异常处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

Spring MVC之異常處理

Spring MVC提供了幾種異常處理的方法:

  • 對于每個異常類的處理
  • 對于每個@Controller類的異常處理
  • 對于所有@Controller類的全局異常處理
  • ?基于@ResponseStatus的異常處理

    通常,處理Web請求時引發的任何未處理的異常都會導致服務器返回HTTP 500響應。 但是,您自己編寫的任何自定義異常都可以使用@ResponseStatus注釋進行注釋。 當一個帶注釋的異常從控制器方法中拋出,并且沒有在其他地方處理時,它會自動返回使用指定的狀態碼的HTTP響應。下面是一個示例,當找不到指定的訂單時,拋出訂單未找到的異常。

    //定義一個@ResponseStatus注釋的異常類 @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order") // 404 public class OrderNotFoundException extends RuntimeException {// ...}//定義一個訂單Controller類 @Controller public class OrderController{@RequestMapping(value="/orders/{id}", method=GET)public String showOrder(@PathVariable("id") long id, Model model) {Order order = orderRepository.findOrderById(id);if (order == null) throw new OrderNotFoundException(id);model.addAttribute(order);return "orderDetail";}}

    上面的實例中,當訪問一個不存在的訂單時,將返回一個HTTP 404錯誤頁面。

    基于Controller的異常處理

    通過在Controller類中單獨添加一個@ExceptionHandler注釋的方法可以處理該Controller類中@RequestMapping注解的方法處理時拋出的異常。@ExceptionHandler注釋的方法可以:

  • 不帶@ResponseStatus注釋的異常(比如系統自帶的異常類)
  • 將用戶引導到專門的錯誤頁面
  • 創建一個總體的自定義錯誤響應
  • @Controller public class ExceptionHandlingController {// @RequestMapping methods...// Exception handling methods// 將指定異常轉換為對應的HTTP狀態碼@ResponseStatus(value=HttpStatus.CONFLICT,reason="Data integrity violation") // 409@ExceptionHandler(DataIntegrityViolationException.class)public void conflict() {// Nothing to do}// 指定用于顯示指定異常的view名稱@ExceptionHandler({SQLException.class,DataAccessException.class})public String databaseError() {// Nothing to do. Returns the logical view name of an error page, passed// to the view-resolver(s) in usual way.// Note that the exception is NOT available to this view (it is not added// to the model) but see "Extending ExceptionHandlerExceptionResolver"// below.return "databaseError";}// 總體控制-將以上具體異常類之外的異常引導到對應錯誤頁. Or// consider subclassing ExceptionHandlerExceptionResolver (see below).@ExceptionHandler(Exception.class)public ModelAndView handleError(HttpServletRequest req, Exception ex) {logger.error("Request: " + req.getRequestURL() + " raised " + ex);ModelAndView mav = new ModelAndView();mav.addObject("exception", ex);mav.addObject("url", req.getRequestURL());mav.setViewName("error");return mav;} }

    上面的實例中,如果@Controller類的@RequestMapping方法執行時拋出了異常,則會觸發@Controller類中異常處理方法。

    如果是DataIntegrityViolationException異常,則返回409錯誤;

    如果是SQLException或DataAccessException,則跳轉到databaseError頁面;

    否則的話,將跳轉到error頁面。

    小技巧

    由于在跳轉到的錯誤頁中,普通用戶是不希望看到具體的JAVA錯誤詳情和代碼調用堆棧的,但是對于程序開發者來說這些信息卻非常有用,因此,可以通過將這些信息轉化為頁面的注釋不失為一個兩全其美的解決方案。

    <!--JSP--> <h1>Error Page</h1><p>Application has encountered an error. Please contact support on ...</p><!--Failed URL: ${url}Exception: ${exception.message}<c:forEach items="${exception.stackTrace}" var="ste"> ${ste} </c:forEach>-->

    ?如果開發者要了解異常詳情的話,可以通過瀏覽HTML源碼來查看。

    全局異常處理-使用@ControllerAdvice?

    雖然上面介紹的兩種異常處理方式都是很好的工作,但是使用@ControllerAdvice的全局異常處理方式更加優雅,它可以處理整個應用程序中所有@Controller類的異常,從而將異常處理邏輯從業務代碼中分離出來。

    所有使用@ControllerAdvice注解的類都可以變成Controller切面,該類中@ExceptionHandler, @InitBinder, @ModelAttribute注解方法可以在所有的@Controller類中共享。

    • @ExceptionHandler注解的方法用于異常處理。
    • @InitBinder注解的方法用于handler方法參數從web請求到java bean的數據綁定。
    • @ModelAttribute注解的方法用于增強Model。

    下面是全局異常示例:

    @ControllerAdvice class GlobalDefaultExceptionHandler {public static final String DEFAULT_ERROR_VIEW = "error";@ResponseStatus(HttpStatus.CONFLICT) // 409@ExceptionHandler(DataIntegrityViolationException.class)public void handleConflict() {// Nothing to do}@ExceptionHandler(value = Exception.class)public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {// If the exception is annotated with @ResponseStatus rethrow it and let// the framework handle it - like the OrderNotFoundException example// at the start of this post.// AnnotationUtils is a Spring Framework utility class.if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null)throw e;// Otherwise setup and send the user to a default error-view.ModelAndView mav = new ModelAndView();mav.addObject("exception", e);mav.addObject("url", req.getRequestURL());mav.setViewName(DEFAULT_ERROR_VIEW);return mav;} }

    ?HandlerExceptionResolver

    DispatcherServlet的應用程序上下文中任何實現HandlerExceptionResolver的類都能攔截和處理Spring MVC系統拋出的并且@Controller類未處理的異常。

    SpringMVC默認創建三個異常解析器。

    • ?ExceptionHandlerExceptionResolver匹配@Controller和@ControllerAdvice注解的handler類中的@ExceptionHandler方法。
    • ResponseStatusExceptionResolver查找@ResponseStatus注解的未捕獲異常?。
    • ?DefaultHandlerExceptionResolver將標準的Spring異常轉化為HTTP狀態碼。?

    SimpleMappingExceptionResolver

    ?Spring很早就提供了一個簡單但方便的HandlerExceptionResolver實現,你可能已經發現它已經被你的應用程序使用過了 - SimpleMappingExceptionResolver。它提供一下功能:

  • 建立異常類和view名稱的映射。
  • 為其他地方未處理異常指定一個默認的錯誤頁。
  • 記錄日志消息。
  • 通過給異常屬性設置名稱將其添加到Model中,這樣就能在view中使用。
  • ?

    @Configuration @EnableWebMvc // Optionally setup Spring MVC defaults (if you aren't using// Spring Boot & haven't specified @EnableWebMvc elsewhere) public class MvcConfiguration extends WebMvcConfigurerAdapter {@Bean(name="simpleMappingExceptionResolver")public SimpleMappingExceptionResolvercreateSimpleMappingExceptionResolver() {SimpleMappingExceptionResolver r =new SimpleMappingExceptionResolver();Properties mappings = new Properties();mappings.setProperty("DatabaseException", "databaseError");mappings.setProperty("InvalidCreditCardException", "creditCardError");r.setExceptionMappings(mappings); // None by defaultr.setDefaultErrorView("error"); // No defaultr.setExceptionAttribute("ex"); // Default is "exception"r.setWarnLogCategory("example.MvcLogger"); // No defaultreturn r;}... }

    轉載于:https://my.oschina.net/spinachgit/blog/1791784

    總結

    以上是生活随笔為你收集整理的Spring MVC之异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。