2015-04-02 15 views
9

W naszej (starszej) bazie kodów, rzucamy WebApplicationExceptions na różne sposoby. Starając się uporządkować sposób, w jaki obsługujemy wyjątki, chciałem stworzyć ExceptionMapper dla tych WAE (i innych).ExceptionMapper dla WebApplicationExceptions zgłaszane z encji?

Uświadomiłem sobie jednak, że Jersey ExceptionMapper Jersey mapuje tylko WAE, które nie zostały rzucone z jednostką.

Na przykład

throw new WebApplicationException(Response.status(500).build()); 

Wyjątek jest złapany przez ExceptionMapper.

throw new WebApplicationException(Response.status(500).entity(WsResourceUtils.createWSResourceRestError(500, "bla")).build()); 

Ten wyjątek NIE jest przechwytywany przez ExceptionMapper.

Oba są wyrzucane z tego samego punktu kodu.

To mój ExceptionMapper:

@Provider 
public class GeneralExceptionMapper implements ExceptionMapper<Throwable> { 

    private static final Logger logger = LoggerFactory.getLogger(GeneralExceptionMapper.class); 

    @Override 
    public Response toResponse(Throwable e) { 
     logger.error("Caught a WAE", e); 
... 
} 

Czy to możliwe, aby stworzyć ExceptionMapper który złapie WebApplicationExceptions nawet jeśli ich reakcja jest już zbudowany z podmiotem?

Używamy Jersey 1.17.

Dzięki.

+0

Dwa lata później problem ten nadal występuje w przypadku produktu Jersey 2. 26 – ChrisO

Odpowiedz

0

należy rozważyć patrząc na kod w GIST:

https://gist.github.com/jeorfevre/9fb2c447a01bcc724998

  1. zarejestrować Mapper że od MagicException który zawiera odpowiedzi
  2. Definiowanie wyjątek, który zawiera odpowiedzi jako
  3. usuwać tego wyjątku
+0

1. To rozwiązanie wymaga ode mnie zmiany każdego miejsca, w które wrzucam WebApplicationExceptions, aby zamiast tego rzucić MagicException. 2. Nie zajmujesz się głównym problemem - MagicException wciąż ma ustawiony obiekt, więc nie zostanie przechwycony przez program odwzorowujący. – Shakkalakka

+0

rozumiem, poprawiam odpowiedź teraz. – jeorfevre

+0

Jak to się różni od tego, co zrobiłem? Mam już program odwzorowujący wyjątki, ale nie przechwytuje WAE, które są już zgłaszane z jednostką. – Shakkalakka