SpringMVC 異常處理
Using HTTP Status Codes
在我們自定義的異常上使用ResponseStatus註解。當我們的Controller丟擲異常,並且沒有被處理的時候,他將返回HTTP STATUS 為指定值的 HTTP RESPONSE,比如:
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order") // 404
public class OrderNotFoundException extends RuntimeException {
// ...
}
我們的Controller為:
@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"; }
這時候會返回404,轉到404頁面而不是錯誤頁面
Controller Based Exception Handling
在一個Controller中,通過增加使用註解@ExceptionHandler的方法來處理@RequestMapping方法丟擲的異常,注意這種只在單個Controller中有效。這麼做可以:
- 發生異常後,改變Response status,一般而言,發生異常返回HTTP STATUS 500.我們可以變為其他。
- 發生錯誤後轉到錯誤頁面
- 可以為不同異常定義不同處理(如不同的錯誤頁面,不同的Response status)
舉例說明
@Controller public class ExceptionHandlingController { // 我們標註了@RequestMapping的方法 ... //處理異常的方法。 // 把我們定義的異常轉換為特定的Http status code @ResponseStatus(value=HttpStatus.CONFLICT, reason="Data integrity violation") // 409 @ExceptionHandler(DataIntegrityViolationException.class) public void conflict() { // Nothing to do } // 捕獲到SQLException,DataAccessException異常之後,轉到特定的頁面。 @ExceptionHandler({SQLException.class,DataAccessException.class}) public String databaseError() { //僅僅轉到錯誤頁面,我們在頁面上得不到這個Exception的值,要得到值,我們可以通過下面的方法得到 return "databaseError"; } // 通過ModelAndView返回頁面,以及往頁面傳相應的值 @ExceptionHandler(Exception.class) public ModelAndView handleError(HttpServletRequest req, Exception exception) { logger.error("Request: " + req.getRequestURL() + " raised " + exception); ModelAndView mav = new ModelAndView(); mav.addObject("exception", exception); mav.addObject("url", req.getRequestURL()); mav.setViewName("error"); return mav; } }
Global Exception Handling
在類上使用 @ControllerAdvice註解,可以使得我們處理整個程式中丟擲的異常。然後在類中的方法上使用@ExceptionHandler來定義處理不同的異常。
舉例:
class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.CONFLICT) // 409
@ExceptionHandler(DataIntegrityViolationException.class)
public void handleConflict() {
// Nothing to do
}
//轉到特定頁面 。。。。。
}
如果我們要處理程式中所有的異常可以這麼做:
@ControllerAdvice
class GlobalDefaultExceptionHandler {
public static final String DEFAULT_ERROR_VIEW = "error";
@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;
}
}
Going Deeper
實現HandlerExceptionResolver介面,SpringMvc可以使用他來處理Controller中丟擲的異常
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex);
}
SpringMvc使用三種預設的HandlerExceptionResolver來處理我們的異常
- ExceptionHandlerExceptionResolver:處理匹配@ExceptionHandler定義的異常。
- ResponseStatusExceptionResolver: 處理新增@ResponseStatus註解的異常
- DefaultHandlerExceptionResolver:把Spring定義的一些標準異常,轉換為HTTP STATUS CODE.
Spring內建的SimpleMappingExceptionResolver實現了HandlerExceptionResolver介面,也是我們經常使用的,XML配置如下:
<bean id="simpleMappingExceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<map>
<!-- key為異常型別,value為要轉到的頁面 -->
<entry key="DatabaseException" value="databaseError"/>
<entry key="InvalidCreditCardException" value="creditCardError"/>
</map>
</property>
<!-- 預設的異常頁面 -->
<property name="defaultErrorView" value="error"/>
<!-- 在頁面我們可以通過ex拿到異常資訊 -->
<property name="exceptionAttribute" value="ex"/>
<!-- Name of logger to use to log exceptions. Unset by default, so logging disabled -->
<!-- log異常資訊,預設不設定-不記錄異常資訊 -->
<property name="warnLogCategory" value="example.MvcLogger"/>
</bean>
相關推薦
SpringMVC異常處理方式
tex return ret 處理器 ann ctype com fields hello 一、描述 在J2EE項目的開發中,不管是對底層的數據庫操作過程,還是業務層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預知的、不可預知的異常需要處理。每個過程都
SpringMVC異常處理
測試 new 前端 tps esp pack instance extend auto 1.1. 異常處理思路 系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,後者主要通過規範代碼開發、測試通過手段減少運行時異
(十一)springMvc 異常處理
思路 在 springMvc 中,異常一層一層的往上拋,最後拋給 前端控制器,前端控制器內部會去找 全域性異常處理器(一個系統只會有一個),進行統一異常處理 ; 對於執行時異常,捕捉到,就直接提示
【SpringMVC整合MyBatis】springmvc異常處理-全域性異常處理器開發
異常處理 1.異常處理思路 系統中異常包括兩類:預期異常和執行時異常RuntimeException,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範程式碼開發、測試通過手段減少執行時異常的發生。 系統的dao、service、controller出現都通過throws E
SpringMVC 異常處理
Using HTTP Status Codes 在我們自定義的異常上使用ResponseStatus註解。當我們的Controller丟擲異常,並且沒有被處理的時候,他將返回HTTP STATUS 為指定值的 HTTP RESPONSE,比如: @ResponseStatus(value=HttpSt
SpringMVC 異常處理 返回異常code及前端AJAX解析
後端: 統一異常處理器 @ControllerAdvice public class DefaultExceptionHandler { @ExceptionHandler(value =
Springmvc 異常處理的優先順序
1、springMVC提供的異常處理主要有兩種方式, ①一種是直接實現自己的HandlerExceptionResolver,當然這也包括使用Spring已經為我們提供好的SimpleMappingExceptionResolver和DefaultHandlerExcept
springmvc異常處理-全域性異常處理器開發
springmvc提供全域性異常處理器進行統一異常處理(一個系統只有一個異常處理器) 自定義的異常類 對不同的異常型別定義異常類,異常類繼承Exception 系統自定義異常類,針對預期的
springMvc異常處理定製化
開發十年,就只剩下這套架構體系了! >>>
springMVC --全局異常處理(兩種方式)
nal font method mil -h util 一個 fail space 首先看springMVC的配置文件: <!-- 全局異常配置 start --> <bean id="exceptionResolv
【Spring】SpringMVC之異常處理
存儲 targe 存在 cnblogs del file 處理機制 href click java中的異常分為兩類,一種是運行時異常,一種是非運行時異常。在JavaSE中,運行時異常都是通過try{}catch{}捕獲的,這種只能捕獲顯示的異常,通常項目上拋出的異常都是不可
SpringMvc的異常處理
成功 配置 exce eth except setview work 問題 class 首先在SpringMVC中加上<mvc:annotation-driven>標簽: <mvc:annotation-driven></mvc:annota
Springmvc異常、攔截器、格式轉換、國際化處理配置文件以及java類
2.3 gin ltm erb nal ges contex utf on() 1.springmvc配置文件自動註解設置。 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.sp
SpringMVC系列(十三)異常處理
supported per ring servlet 標記 ext test 頁面 ansi 一、簡介 ? Spring MVC 通過 HandlerExceptionResolver 處理程序的異常,包括 Handler 映射、數據綁定以及目標方法執行時發生的異常。? S
SpringMVC 統一異常處理
Java1 描述在J2EE項目的開發中,不管是對底層的數據庫操作過程,還是業務層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預知的、不可預知的異常需要處理。每個過程都單獨處理異常,系統的代碼耦合度高,工作量大且不好統一,維護的工作量也很大。那麽,能不能將所有類型的異常處理從各處理過程解耦出來,這樣
SpringMVC源碼分析-400異常處理流程及解決方法
defining count ror error this 設計模式 進入 如何 16px 本文設計SpringMVC異常處理體系源碼分析,SpringMVC異常處理相關類的設計模式,實際工作中異常處理的實踐。 問題場景 假設我們的SpringMVC應用中有如下控制器: 代
springMVC--全局異常處理
font spa 請求 spring lsi request ann RR javax 全局異常主要處理controller中拋出的異常,需註意controller中不需要捕獲異常 一、@ControllerAdvice + @ExceptionHandler 實現全局
springMVC整理04--文件上傳 & 攔截器 & 異常處理
1.2 cli 啟用 錯誤頁 ini val con 捕獲 錯誤頁面 1. 文件上傳 SpringMVC 的文件上傳非常簡便,首先導入文件上傳依賴的 jar: 1 <!-- 文件上傳所依賴的 jar 包 --> 2 <dependency>
Java框架-SpringMVC統一異常處理、ssm框架整合
1. SpringMVC中異常處理 1.1 各層處理異常原則即實現方法 1.1.1 各層處理異常原則 dao:不處理,拋異常; service:不處理,拋異常; controller/servlet:必須處理,否則錯誤資訊將直接在瀏覽器顯示給使用者看。 1.1.2 異
SpringMVC響應檢視丶檔案上傳丶異常處理丶攔截器
SpringMVC響應資料和結果檢視 返回值分類 返回字串 Controller方法返回字串可以指定邏輯檢視的名稱,根據檢視解析器為物理檢視的地址。 引數可以寫一個Model來儲存域物件中的值 應用例子: @Controller @Req