2012-10-04 16 views
9

Powiedzmy mam 3 klasy wyjątków, że chce "haczyk":Jersey ExceptionMapper i dziedziczenie

  • WebApplicationException Jersey
  • MyException rozciąga RuntimeException
  • Wyjątek

chcę WebApplicationException aby nadal mapować automagicznie przez Jersey, MyException do mapowania przez MyMapper i mieć pewność, że wszelkie inne wyjątki są również mapowane przez MyFallbackMapper.

Ponieważ wszystkie wyjątki (które chcę kontrolować) ostatecznie rozszerzają wyjątek, czy istnieje gwarancja, że ​​MyMapper (a nie MyFallbackMapper) zostanie użyty dla MyException?

Odpowiedz

13

JAX-RS 1,1 Spec rozdział 4.4:

Kiedy klasa źródło lub sposób dostawca zgłasza wyjątek, wykonawcze JAX-RS spróbuje mapować wyjątku odpowiedniej odpowiedzi HTTP - patrz sekcja 3.3.4 . Aplikacja może dostarczyć dostawcom mapowania wyjątków w celu dostosowania tego odwzorowania.

Dostawcy mapowania wyjątków mapują wyjątek sprawdzany lub wykonawczy na wystąpienie odpowiedzi. Wyjątkowy dostawca map implementuje interfejs ExceptionMapper i jest opatrzony adnotacją @Provider. Gdy metoda zasobów zgłasza wyjątek, dla którego istnieje dostawca mapowania wyjątków, dostawca dopasowania jest używany do uzyskania instancji odpowiedzi. Wynikowa odpowiedź jest przetwarzana tak, jakby metoda wyrzucająca wyjątek zamiast tego zwróciła odpowiedź, patrz sekcja 3.3.3.

Wybierając dostawcę mapowania wyjątków w celu odwzorowania wyjątku, implementacja MUSI korzystać z dostawcy, którego typem ogólnym jest najbliższa nadklasa wyjątku.

+0

Dzięki. Nie wiedziałem, że to część jax-rs! –

+0

To jest w specyfikacji jest ładne, ale Jersey nie spełnia. Widziałem go obsługiwać (przy użyciu przykładu OP) obsługiwać 'MyException' przy użyciu' MyFallbackMapper'. – Jorn

+0

w takim przypadku prosimy o zgłoszenie błędu na stronie https://java.net/jira/browse/JERSEY/, udostępnienie sprawy testowej i dołączenie linku do testu. dzięki! –