J'apprends JAX-RS (alias JSR-311) en utilisant Jersey. J'ai réussi à créer une ressource racine et je joue 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 gère n'importe quel format dans les paramètres régionaux actuels qui est compris par le constructeur Date (chaîne) (comme AAAA / mm / jj et mm / jj / AAAA). Mais si je fournis une valeur non valide ou non comprise, j'obtiens une réponse 404.
Par exemple:
GET /hello?name=Mark&birthDate=X
404 Not Found
Comment puis-je personnaliser ce comportement? Peut-être un code de réponse différent (probablement "400 Bad Request")? Qu'en est-il de l'enregistrement d'une erreur? Peut-être ajouter une description du problème ("format de date incorrect") dans un en-tête personnalisé pour faciliter le dépannage? Ou renvoyer une réponse d'erreur complète avec des détails, ainsi qu'un code d'état 5xx?
ExceptionMapper
interface (qui est une meilleure approche que l'extension). Voir plus ici vvirlan.wordpress.com/2015/10/19/…Créez la classe ci-dessus. Cela 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. que vous devez mapper pour fournir des réponses personnalisées.
la source
Jersey lève une exception com.sun.jersey.api.ParamException lorsqu'il ne parvient pas à démêler les paramètres, une solution consiste donc à créer un ExceptionMapper qui gère ces types d'exceptions:
la source
Vous pouvez également écrire une classe réutilisable pour les variables annotées QueryParam
puis utilisez-le comme ceci:
Bien que la gestion des erreurs soit triviale dans ce cas (lancement d'une réponse 400), l'utilisation de cette classe vous permet de factoriser la gestion des paramètres en général, ce qui peut inclure la journalisation, etc.
la source
DateParam
celle ci-dessus qui encapsule unorg.joda.time.DateTime
au lieu dejava.util.Calendar
. Vous l'utilisez avec@QueryParam
plutôt queDateTime
lui-même.JodaModule
qui peut être enregistré avec laObjectMapper
registerModules
méthode. Il peut gérer toutes les conversions de type joda.com.fasterxml.jackson.datatype.joda.JodaModule
Une solution évidente: prenez une chaîne, convertissez-vous en date vous-même. De cette façon, vous pouvez définir le format souhaité, intercepter les exceptions et relancer ou personnaliser l'erreur envoyée. Pour l'analyse, SimpleDateFormat devrait fonctionner correctement.
Je suis sûr qu'il existe également des moyens de connecter des gestionnaires pour les types de données, mais peut-être que peu de code simple est tout ce dont vous avez besoin dans ce cas.
la source
Moi aussi j'aime StaxMan implémenterait probablement ce QueryParam en tant que chaîne, puis gérerais la conversion, en la reconduisant si nécessaire.
Si le comportement spécifique aux paramètres régionaux est le comportement souhaité et attendu, vous utiliseriez ce qui suit pour renvoyer l'erreur 400 BAD REQUEST:
throw new WebApplicationException(Response.Status.BAD_REQUEST);
Voir JavaDoc pour javax.ws.rs.core.Response.Status pour plus d'options.
la source
La documentation de @QueryParam indique
Si vous souhaitez contrôler la réponse envoyée à l'utilisateur lorsque le paramètre de requête sous forme de chaîne ne peut pas être converti en votre type T, vous pouvez lever WebApplicationException. Dropwizard est livré avec les classes * Param suivantes que vous pouvez utiliser selon vos besoins.
BooleanParam, DateTimeParam, IntParam, LongParam, LocalDateParam, NonEmptyStringParam, UUIDParam. Voir https://github.com/dropwizard/dropwizard/tree/master/dropwizard-jersey/src/main/java/io/dropwizard/jersey/params
Si vous avez besoin de Joda DateTime, utilisez simplement Dropwizard DateTimeParam .
Si la liste ci-dessus ne correspond pas à vos besoins, définissez les vôtres en étendant AbstractParam. Remplacer la méthode d'analyse. Si vous avez besoin de contrôler le corps de réponse d'erreur, remplacez la méthode d'erreur.
Un bon article de Coda Hale à ce sujet est à http://codahale.com/what-makes-jersey-interesting-parameter-classes/
Le constructeur Date (String arg) est obsolète. J'utiliserais des classes de date Java 8 si vous êtes sur Java 8. Sinon, l'heure de date Joda est recommandée.
la source
C'est le comportement correct en fait. Jersey essaiera de trouver un gestionnaire pour votre entrée et essaiera de construire un objet à partir de l'entrée fournie. Dans ce cas, il essaiera de créer un nouvel objet Date avec la valeur X fournie au constructeur. Puisqu'il s'agit d'une date invalide, par convention, Jersey renverra 404.
Ce que vous pouvez faire est de réécrire et de mettre la date de naissance sous forme de chaîne, puis essayez d'analyser et si vous n'obtenez pas ce que vous voulez, vous êtes libre de lever toute exception que vous voulez par l'un des mécanismes de mappage d'exception (il existe plusieurs ).
la source
J'étais confronté au même problème.
Je voulais attraper toutes les erreurs à un endroit central et les transformer.
Voici le code de la façon dont je l'ai géré.
Créez la classe suivante qui implémente
ExceptionMapper
et ajoutez des@Provider
annotations sur cette classe. Cela gérera toutes les exceptions.Remplacez la
toResponse
méthode et renvoyez l'objet Response rempli avec des données personnalisées.la source
Approche 1: en étendant la classe WebApplicationException
Créer une nouvelle exception en étendant WebApplicationException
Lancez maintenant «RestException» chaque fois que nécessaire.
Vous pouvez voir la demande complète sur ce lien .
Approche 2: implémenter ExceptionMapper
Le mappeur suivant gère l'exception de type 'DataNotFoundException'
Vous pouvez voir la demande complète sur ce lien .
la source
Tout comme une extension de @Steven Lavine, répondez au cas où vous voudriez ouvrir la fenêtre de connexion du navigateur. J'ai trouvé difficile de renvoyer correctement la réponse ( authentification HTTP MDN ) du filtre au cas où l'utilisateur ne serait pas encore authentifié
Cela m'a aidé à construire la réponse pour forcer la connexion au navigateur, notez la modification supplémentaire des en-têtes. Cela définira le code d'état sur 401 et définira l'en-tête qui amènera le navigateur à ouvrir la boîte de dialogue nom d'utilisateur / mot de passe.
la source