天天看點

SpringMVC 異常處理.

一、異常處理

Spring提供了多種方式将異常轉換為響應:

  • 特定的Spring異常将會自動映射為指定的HTTP狀态碼

    在預設情況下,Spring會将自身的一些異常自動轉換為合适的狀态碼,進而回報給用戶端。實際上,如果沒有出現任何映射的異常,響應都會帶有500狀态碼。映射表如下:

SpringMVC 異常處理.
  • 自定義異常上可以添加@ResponseStatus注解,進而将其映射為某一個HTTP狀态碼

    盡管這些内置映射是很有用的,但是當我們的業務系統出現RuntimeException時,如果Spring找不到對應的内置映射,就預設是500的狀态碼,如果我們不想要500的狀态碼呢?怎麼将我們自定義的Exception映射成想要的狀态碼呢?

SpringMVC 異常處理.
SpringMVC 異常處理.
1 /**
2  * value 要比對的異常狀态碼
3  * reson 提示的異常原因
4  */
5 @ResponseStatus(value = HttpStatus.NOT_FOUND,reason = "Own Exception")
6 public class OwnException extends RuntimeException {
7 }      

自定義異常類

  • 在方法上可以添加@ExceptionHandler注解,使其用來處理異常

    有很多時候,我們是不想把醜陋的報錯頁面直接展示給客戶來看的,常見的做法是:搭建一個友好的頁面,比如 error.jsp ,當發生異常的時候,傳回這個頁面給用戶端。但是五花八門的處理器方法,如果每個地方都做這樣的處理,我們的程式就會略顯臃腫......Spring 為我們 提供了一種控制器通知(@ControllerAdvice),即:當所有控制器中帶有@RequestMapping注解的方法上 出現異常的時候,就委托給這個類的@ExceptionHandler方法處理。

SpringMVC 異常處理.
SpringMVC 異常處理.
@ControllerAdvice
public class ExceptionHandle {

    /**
     * 當出現異常的時候,就傳回error頁面,當然可以多寫幾個ExceptionHandler 方法,細化你的異常處理
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public String handleException(){
        return "error";
    }
}      

View Code

二、跨重定向請求傳遞資料 

   在控制器方法傳回的String 視圖名稱中,如果以"redirect:"開頭,那麼這個String不是用來查找視圖的,而是用來指導浏覽器進行重定向的路徑。有些時候,我們希望浏覽器進行重定向後,有些資料是可以保留下來的,這聽起來不可思議,但SpringMVC為我們提供了兩種方案:

  • 使用URL 模闆以路徑變量或查詢參數的形式傳遞資料

這種方式将參數放在路徑變量中傳遞,但是有一個缺點就是不能傳遞複雜的對象...

SpringMVC 異常處理.
SpringMVC 異常處理.
@RequestMapping(value = "/home",method = RequestMethod.GET)
    public String getHome(Model model){
        model.addAttribute("userName","userName");
        model.addAttribute("id",123);
        return "redirect:/home/{userName}";
    }      

像這樣,如果最後的路徑會被解析為 /home/userName?id=123

  • 通過flash屬性發送資料

如果要傳遞一些對象要怎麼做呢?有一種方式就是在重定向前存在session中,在重定向後再從session中取出來,再清理session。實際上,這種方式是可行的,也是值得推薦的。而且以下介紹的這種(flash attribute)就是基于這個原理的。

SpringMVC 異常處理.
SpringMVC 異常處理.
/**
     * 重定向前
     * @param model RedirectAttributes ,保證對象在重定向的過程中存活下來
     * @return
     */
    @RequestMapping(value = "/list",method = RequestMethod.GET)
    public String getList(RedirectAttributes model){
        model.addAttribute("show","show");
        List<String> list = new ArrayList<String>();
        list.add("str");
        model.addFlashAttribute("list",list); // flashAttribute
        return "redirect:{show}";
    }

    /**
     * 重定向後
     * @param model
     * @return
     */
    @RequestMapping(value = "/show",method = RequestMethod.GET)
    public String showList(Model model){
        System.out.println(model.containsAttribute("list")); //true
        return "home";
    }      
SpringMVC 異常處理.