2012-06-08 22 views
38

Czy istnieje sposób na globalną obsługę wyjątków w Jersey? Zamiast pojedynczych zasobów posiadających bloki try/catch, a następnie wywoływanie jakiejś metody, która następnie oczyszcza wszystkie wyjątki, które mają być odesłane do klienta, miałem nadzieję, że istnieje sposób na umieszczenie tego, w którym zasoby są rzeczywiście wywoływane. Czy to możliwe? Jeśli tak to jak?Global Exception Handling in Jersey

Zamiast, gdzie sanitize(e) rzucał jakieś wyjątkiem Jersey skonfigurowane do apletu Jersey:

@GET 
public Object getStuff() { 
    try { 
     doStuff(); 
    } catch (Exception e) { 
     ExceptionHandler.sanitize(e); 
    } 
} 

mający:

@GET 
public Object getStuff() throws Exception { 
    doStuff(); 
} 

gdzie wyjątek trafiają do czegoś, co mogę przechwycić i zadzwonić pod numer sanitize(e).

To naprawdę jest po prostu uproszczenie wszystkich zasobów w Jersey i zagwarantowanie, że wyjątki wracające do klienta są zawsze w jakiejś zrozumiałej formie.

Odpowiedz

38

Tak. JAX-RS ma koncepcję ExceptionMappers. Możesz stworzyć swój własny interfejs ExceptionMapper, aby odwzorować każdy wyjątek od odpowiedzi. Aby uzyskać więcej informacji, zobacz: https://jersey.github.io/nonav/documentation/1.12/jax-rs.html#d4e435

+3

To działa, jeśli robię ExceptionMapper więc wszystkie wyjątki dostać kierowane do tej metody. Dzięki. – Trisfall

+3

Albo nawet 'ExceptionMapper ', możesz także obsłużyć wyrzucone 'Error's. – tsauerwein

3

javax.ws.rs.ext.ExceptionMapper jest twoim przyjacielem.

Źródło: https://jersey.java.net/documentation/latest/representations.html#d0e6665

Przykład:

@Provider 
public class EntityNotFoundMapper implements ExceptionMapper<javax.persistence.EntityNotFoundException> { 
    public Response toResponse(javax.persistence.EntityNotFoundException ex) { 
    return Response.status(404). 
     entity(ex.getMessage()). 
     type("text/plain"). 
     build(); 
    } 
} 
+1

BTW, wydaje się, że nie wszystkie wyjątki przeszły przez "ExcpetionMapper". 'WebApplicationException' był obsługiwany w innym miejscu. Jest to problem, jeśli na przykład chciałbym rejestrować wszystkie wyjątki. –