Spring MVC 使用@ExceptionHandler注解

2018-07-26 14:33 更新

HandlerExceptionResolver接口以及SimpleMappingExceptionResolver解析器類的實(shí)現(xiàn)使得你能聲明式地將異常映射到特定的視圖上,還可以在異常被轉(zhuǎn)發(fā)(forward)到對應(yīng)的視圖前使用Java代碼做些判斷和邏輯。不過在一些場景,特別是依靠@ResponseBody返回響應(yīng)而非依賴視圖解析機(jī)制的場景下,直接設(shè)置響應(yīng)的狀態(tài)碼并將客戶端需要的錯(cuò)誤信息直接寫回響應(yīng)體中,可能是更方便的方法。

你也可以使用@ExceptionHandler方法來做到這點(diǎn)。如果@ExceptionHandler方法是在控制器內(nèi)部定義的,那么它會(huì)接收并處理由控制器(或其任何子類)中的@RequestMapping方法拋出的異常。如果你將@ExceptionHandler方法定義在@ControllerAdvice類中,那么它會(huì)處理相關(guān)控制器中拋出的異常。下面的代碼就展示了一個(gè)定義在控制器內(nèi)部的@ExceptionHandler方法:

@Controller
public class SimpleController {

    // @RequestMapping methods omitted ...

    @ExceptionHandler(IOException.class)
    public ResponseEntity<String> handleIOException(IOException ex) {
        // prepare responseEntity
        return responseEntity;
    }

}

此外,@ExceptionHandler注解還可以接受一個(gè)異常類型的數(shù)組作為參數(shù)值。若拋出了已在列表中聲明的異常,那么相應(yīng)的@ExceptionHandler方法將會(huì)被調(diào)用。如果沒有給注解任何參數(shù)值,那么默認(rèn)處理的異常類型將是方法參數(shù)所聲明的那些異常。

與標(biāo)準(zhǔn)的控制器@RequestMapping注解處理方法一樣,@ExceptionHandler方法的方法參數(shù)和返回值也可以很靈活。比如,在Servlet環(huán)境下方法可以接收HttpServletRequest參數(shù),而Portlet環(huán)境下方法可以接收PortletRequest參數(shù)。返回值可以是String類型——這種情況下會(huì)被解析為視圖名——可以是ModelAndView類型的對象,也可以是ResponseEntity?;蛘吣氵€可以在方法上添加@ResponseBody注解以使用消息轉(zhuǎn)換器會(huì)轉(zhuǎn)換信息為特定類型的數(shù)據(jù),然后把它們寫回到響應(yīng)流中。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)