web-dev-qa-db-fra.com

Gestion des exceptions globales à Jersey

Existe-t-il un moyen de gérer les exceptions globales à Jersey? Au lieu que les ressources individuelles aient des blocs try/catch et appellent ensuite une méthode qui nettoie ensuite toutes les exceptions à renvoyer au client, j'espérais qu'il y avait un moyen de mettre cela là où les ressources sont réellement appelées. Est-ce seulement possible? Si c'est le cas, comment?

Au lieu de, où sanitize(e) lèverait une sorte d'exception configurée par Jersey au servlet Jersey:

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

Ayant:

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

où l'exception serait levée vers quelque chose que je peux intercepter et appeler sanitize(e) à partir de là.

C'est vraiment juste pour simplifier toutes les ressources Jersey et pour garantir que les exceptions remontant au client sont toujours sous une forme compréhensible.

41
Trisfall

Oui. JAX-RS a un concept d'ExceptionMappers. Vous pouvez créer votre propre interface ExceptionMapper pour mapper toute exception à une réponse. Pour plus d'informations, voir: https://jersey.github.io/documentation/latest/representations.html#d0e6352

42
Martin Matula

javax.ws.rs.ext.ExceptionMapper est votre ami.

Source: https://jersey.Java.net/documentation/latest/representations.html#d0e6665

Exemple:

@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();
  }
}
5
AlikElzin-kilaka