resteasy是jboss提供的一個restful基礎架構,使用它我們可以很友善的建構我們的restful服務,而且它也完全符合java的jax-rs2.0标準,很多第三方restful架構也都是基于resteasy開發的。
在任何架構中都不可避免的涉及到異常處理,restful架構也是如此。按照我們一般傳統異常處理方式,在restful的最外層,我們一般會對所有的業務調用都加上try catch,以免異常被使用者接收到,比如我們有這麼一個restful服務:
上面userapi接口中的getuserbid()方法調用了userservice.getuser()服務,這個服務會抛出一些異常,userapi需要捕獲異常并傳回客戶的一個錯誤的響應。還有一點我們一般會在api層catch一個exception異常,也就是捕獲所有可能發生的異常情況,以免前端出現不友好的錯誤提示。
這麼做也沒什麼問題,但是我們的接口不隻是一個,每個接口需要進行try catch來處理異常,這麼做顯然不符合我們的程式設計思想,我們希望把所有異常集中到一個地方處理。
如果我們的restful架構是基于resteasy的,那麼我們就可以使用exceptionmapper來實作一個通用異常處理類。
exceptionmapper是provider的一個協定,它會将java的異常映射到response對象。是以要進行通用異常處理,我們隻需要寫一個類來實作exceptionmapper接口,并把它聲明為一個provider即可:
上面的exceptionmapper的實作已經寫好了,下面我們寫個restful api來測試下:
在這個接口中,我們并沒有對異常做特殊處理,也沒有catch一個exception異常,僅僅是把異常抛出,而所有的異常處理都集中在了myapplicationexceptionhandler中。
我們測一下這個接口,首先我們寫一個合法的請求:
<a href="http://localhost:8080/resteasyexceptionmapperdemo/rest/users/1">http://localhost:8080/resteasyexceptionmapperdemo/rest/users/1</a>

我們再寫一個不合法的請求,請求的參數是個字元串而不是數值:
<a href="http://localhost:8080/resteasyexceptionmapperdemo/rest/users/abc">http://localhost:8080/resteasyexceptionmapperdemo/rest/users/abc</a>