2013年10月14日 星期一

攔截 Jersey 的 Exception 時略過 Jersey 自身吐出的 Exception

如果在使用 ExceptionMapper 時,攔截了所有的 RuntimeException 的話,預設會連 Jersey 吐的 WebApplicationException 一起攔截
因此會導致像是透過 GET 去存取應該用 POST 存取的 URL 時,應該要吐的 405 Method Not Allowed 一起被攔截並轉成指定的 Response 了。
而單獨略過 WebApplicationException 的方法可以參考 [1]。

基本原理就只是檢查 Exception 是不是 WebApplicationException,是的話就把它內建的 Response 作為回應吐出去。
if (e instanceof WebApplicationException) {
  // @see http://java.net/jira/browse/JERSEY-1607
  WebApplicationException webApplicationException = (WebApplicationException) e;
  return webApplicationException.getResponse();
}

參考資料:
1、Jersey: How to register a ExceptionMapper that omits some subclasses?

沒有留言: