227 votes

JAX-RS / Jersey comment personnaliser la gestion des erreurs ?

Je suis en train d'apprendre JAX-RS (aka, la JSR-311) à l'aide de Jersey. J'ai réussi à créé une Racine de Ressources et je suis à jouer avec les paramètres:

@Path("/hello")
public class HelloWorldResource {

    @GET
    @Produces("text/html")
    public String get(
        @QueryParam("name") String name,
        @QueryParam("birthDate") Date birthDate) {

         // Return a greeting with the name and age
    }
}

Cela fonctionne très bien, et prend en charge n'importe quel format dans la locale courante qui est compris par la Date(String) constructeur (YYYY/mm/jj mm/jj/AAAA). Mais si je fournir une valeur qui n'est pas valide ou n'a pas compris, je reçois une réponse 404.

Par exemple:

GET /hello?name=Mark&birthDate=X

404 Not Found

Comment puis-je personnaliser ce comportement? Peut-être une autre réponse code (probablement "400 Bad Request")? Ce sujet de l'enregistrement d'une erreur? Peut-être ajouter une description du problème ("mauvais format de date") dans un en-tête personnalisé à l'aide de dépannage? Ou de retourner un ensemble de réponse d'Erreur avec les détails, avec un 5xx code d'état?

280voto

Steve Levine Points 2214

Il existe plusieurs approches pour personnaliser la gestion des erreurs de comportement avec JAX-RS. Voici trois de la plus simple des façons.

La première approche consiste à créer une classe d'Exception qui s'étend WebApplicationException.

Exemple:

public class NotAuthorizedException extends WebApplicationException {
     public NotAuthorizedException(String message) {
         super(Response.status(Response.Status.BAD_REQUEST)
             .entity(message).type(MediaType.TEXT_PLAIN).build());
     }
}

Et pour lancer ce nouveau créer Exception, il vous suffit de:

@Path("accounts/{accountId}/")
    public Item getItem(@PathParam("accountId") String accountId) {
       // An unauthorized user tries to enter
       throw new NotAuthorizedException("You Don't Have Permission");
}

Remarquez, vous n'avez pas besoin de déclarer l'exception d'une clause throws parce que WebApplicationException est une Exception d'exécution. Ce sera de retour une réponse 401 pour le client.

La deuxième et la plus facile est de simplement construire une instance de la WebApplicationException directement dans votre code. Cette approche fonctionne aussi longtemps que vous n'avez pas à mettre en place votre propre application des Exceptions.

Exemple:

@Path("accounts/{accountId}/")
public Item getItem(@PathParam("accountId") String accountId) {
   // An unauthorized user tries to enter
   throw new WebApplicationException(Response.Status.UNAUTHORIZED);
}

Ce code trop renvoie un 401 pour le client.

Bien sûr, c'est juste un exemple simple. Vous pouvez faire de l'Exception beaucoup plus complexe si nécessaire, et vous pouvez générer ce code de réponse http, vous devez.

Une autre approche consiste à enrouler une Exception existante, peut-être un ObjectNotFoundException avec un petit emballage de la classe qui implémente l'ExceptionMapper interface annotée avec @Fournisseur d'annotation. Ceci dit à JAX-RS de l'exécution, que si la enveloppé Exception est levée, le retour de la réponse de code défini dans le ExceptionMapper.

70voto

Arnav Points 295
<pre><code></code><p>Créer au-dessus de classe. Il gérera 404 (NotFoundException) et ici, dans la méthode toResponse, vous pouvez donner votre réponse personnalisée. De même, il y a ParamException etc., dont vous auriez besoin de mapper pour apporter des réponses personnalisées.</p></pre>

40voto

Jan Kronquist Points 1527

Maillot lève un com.sun.jersey.api.ParamException lorsqu’il ne parvient pas à unmarhall les paramètres pour une solution consiste à créer une ExceptionMapper qui gère ces types d’exceptions :

27voto

Charles Brooking Points 354

Vous pouvez également écrire une classe réutilisable pour les variables annotée QueryParam

puis l’utiliser comme ceci :

Bien que la gestion des erreurs est négligeable dans le cas présent (lancer une réponse 400), à l’aide de cette classe vous permet au paramètre de facteur-out de manutention en général qui peut-être inclure la journalisation etc..

11voto

StaxMan Points 34626

Une solution évidente : prendre dans une chaîne, les convertir à ce jour vous-même. De cette façon, que vous pouvez définir format vous voulez, les exceptions de captures et soit re-jeter ou personnaliser erreur envoyé. Pour l’analyse, SimpleDateFormat devrait fonctionner correctement.

Je suis sûr qu’il y a des façons pour raccorder des gestionnaires pour les types de données trop, mais peut-être peu de code simple est tout ce que vous devez dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X