JAX-RS / Jersey comment personnaliser erreur de manipulation?
Je suis en apprentissage de 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?
Vous devez vous connecter pour publier un commentaire.
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:
Et pour lancer ce nouveau créer Exception, il vous suffit de:
Avis, 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:
Ce code trop renvoie un 401 pour le client.
De 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.
ExceptionMapper
de l'interface (ce qui est une meilleure approche de l'étendant ensuite). Voir plus ici vvirlan.wordpress.com/2015/10/19/...NotFoundException
, par exempleBadRequestException
, il semble donc que le fait d'avoirString
type d'argument et d'aller la conversion manuellement est le moyen le plus facile. Voir aussi CXF-numéro 4976.Créer au-dessus de la classe. Cela permettra de gérer 404 (NotFoundException) et ici dans toResponse méthode, vous pouvez donner votre réponse personnalisée. De même, il y a ParamException etc. qui vous aurait besoin de carte pour fournir des réponses personnalisées.
Jersey jette un com.soleil.jersey.l'api.ParamException quand il ne parvient pas à unmarshall les paramètres, donc la seule solution est de créer un ExceptionMapper qui s'occupe de ces types d'exceptions:
Vous pouvez également écrire une classe réutilisable pour QueryParam annotée variables
puis l'utiliser comme ceci:
Bien que la gestion d'erreur est négligeable dans ce cas (en jetant un 400 de réponse), l'utilisation de cette classe permet de facteur de paramètre de la manipulation en général, ce qui pourrait inclure la journalisation etc.
DateParam
un au-dessus de qui encapsule uneorg.joda.time.DateTime
au lieu dejava.util.Calendar
. Vous l'utiliser avec@QueryParam
plutôt queDateTime
lui-même.JodaModule
peuvent être enregistrés avec leObjectMapper
registerModules
méthode. Il peut traiter tous les joda les conversions de type.com.fasterxml.jackson.datatype.joda.JodaModule
Une solution évidente: prendre une Chaîne à convertir à Jour vous-même. De cette façon, vous pouvez définir le format que vous souhaitez, de capturer des exceptions et re-jeter ou de personnaliser l'erreur est envoyé.
Pour l'analyse, la SimpleDateFormat devrait fonctionner correctement.
Je suis sûr qu'il existe des moyens pour accrocher 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.
J'aime trop StaxMan serait probablement mettre en œuvre que QueryParam comme une Chaîne de caractères, puis de gérer la conversion, renvoi si nécessaire.
Si les paramètres régionaux spécifiques de comportement est souhaitée et attendue, vous utilisez la commande suivante pour retourner les 400 BAD REQUEST error:
throw new WebApplicationException(Response.Status.BAD_REQUEST);
Voir la JavaDoc de javax.ws.rs.de base.Réponse.Statut pour plus d'options.
@QueryParam documentation dit
Si vous voulez contrôler ce que la réponse va de l'utilisateur, lors de l'paramètre de requête dans la forme d'une Chaîne ne peut pas être convertie en fonction de votre type T, vous pouvez jeter WebApplicationException. Dropwizard est livré avec les éléments suivants: *Param classes que vous pouvez utiliser pour 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, il suffit d'utiliser Dropwizard DateTimeParam.
Si la liste ci-dessus n'est pas de répondre à vos besoins, définir vos propres en étendant AbstractParam. Remplacer méthode d'analyse. Si vous avez besoin de contrôler l'erreur corps de la réponse, substituez la méthode d'erreur.
Bon article de Coda Hale sur ce qui est à http://codahale.com/what-makes-jersey-interesting-parameter-classes/
Date(String arg) constructeur est obsolète. Je voudrais utiliser Java 8 classes de date si vous êtes sur l'île de Java 8. Sinon joda date heure est recommandée.
C'est le comportement correct en fait. Jersey vais essayer de trouver un gestionnaire pour votre entrée et va essayer de construire un objet à partir de la condition d'entrée. Dans ce cas, il va tenter de créer un nouvel objet Date avec la valeur X fourni par le constructeur. Puisque c'est une date non valide, par la convention de Jersey sera de retour 404.
Ce que vous pouvez faire est de réécrire et mettre la date de naissance d'une Chaîne de caractères, puis essayez d'analyser et si vous n'obtenez pas ce que vous voulez, vous êtes libre de lancer une exception vous le souhaitez en toute exception de la cartographie des mécanismes (il y en a plusieurs).
Comme une extension de @Steven Lavine réponse dans le cas où vous souhaitez ouvrir le navigateur de la fenêtre de connexion. J'ai trouvé difficile de retourner correctement la Réponse (MDN Authentification HTTP) du Filtre dans le cas où l'utilisateur n'est pas authentifié
Cela m'a aidé à construire la Réponse à la force du navigateur de connexion, remarque la modification des en-têtes. Ceci permettra de définir le code d'état à 401 et la tête qui provoque le navigateur pour ouvrir le nom d'utilisateur/mot de passe de boîte de dialogue.