1. 程式人生 > >SpringMVC 異常處理

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中有效。這麼做可以:

  1. 發生異常後,改變Response status,一般而言,發生異常返回HTTP STATUS 500.我們可以變為其他。
  2. 發生錯誤後轉到錯誤頁面
  3. 可以為不同異常定義不同處理(如不同的錯誤頁面,不同的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來處理我們的異常

  1. ExceptionHandlerExceptionResolver:處理匹配@ExceptionHandler定義的異常。
  2. ResponseStatusExceptionResolver: 處理新增@ResponseStatus註解的異常
  3. 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