Les mappeurs Exception Jersey ne fonctionnent pas lorsque la désérialisation jackson échoue
Je suis à l'aide de Jersey 2.10 avec Jackson de sérialisation/désérialisation dans mon API REST.
Mon idée est de faire de mon API REST pour toujours retourner une norme JSON réponse d'erreur. Pour ce que j'ai ExceptionMapper classes construire des json réponses d'erreur pour toute exception levée dans le Maillot de l'application. J'ai aussi une jsp qui produit le même genre de réponse JSON, je me suis inscrit comme une erreur de page dans le web.xml qui couvre toutes les erreurs qui pourraient être portées devant Jersey en cours de chargement.
Mais il existe un cas qui n'est ni mon Exception des contributeurs, ni mon json production de jsp sont travail, c'est lors de l'envoi d'une mauvaise formé json à un POSTE de REPOS d'extrémité qui retourne le message suivant:
HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, DELETE, PUT
Content-Type: text/plain
Content-Length: 210
Date: Tue, 24 Jun 2014 22:14:11 GMT
Connection: close
Can not deserialize instance of com.example.rest.User[] out of START_OBJECT token
at [Source: org.glassfish.jersey.message.internal.EntityInputStream@1dcccac; line: 1, column: 1]
Comment puis-je faire de Jersey pour revenir à ma réponse d'erreur personnalisé au lieu de cela?
Mise à JOUR:
En fonction de la réponse par @Lucasz, j'ai fait plus de recherches et découvert qu'il y a deux Exception mappeurs définis dans le package com.fasterxml.jackson.jaxrs.de base (https://github.com/FasterXML/jackson-jaxrs-providers/tree/master/base/src/main/java/com/fasterxml/jackson/jaxrs/base) JsonMappingExceptionMapper et JsonParseExceptionMapper, qui semblent être à l'ombrage de mon custom mappeurs.
Comment puis-je me désinscrire de ces cartographes?
C'est de cette façon je suis actuellement en enregistrement, les cartographes:
@ApplicationPath("/")
public class MyApp extends ResourceConfig{
public SyntheticAPIApp() {
packages("com.example.resource", "com.example.mapper");
register(org.glassfish.jersey.jackson.JacksonFeature.class);
}
}
source d'informationauteur raspacorp
Vous devez vous connecter pour publier un commentaire.
Je l'ai testé avec une exception mapper comme ci-dessous:
et cela a fonctionné.
Mise à jour: changé JsonParseException à JsonProcessingException (plus général)
Update2:
Afin d'éviter l'enregistrement de l'indésirables mappeurs de remplacer
avec
Regarder le code source de JacksonFeature et vous comprendrez ce qui se passe.
J'ai eu le même problème, et la réponse précédente m'a conduit à la solution, mais n'a pas été bifurcation pour moi actuel Jersey (2.22). Au premier abord, j'avais besoin d'utiliser la
org.glassfish.jersey.spi.ExtendedExceptionMapper
comme décrit dans https://jersey.java.net/documentation/latest/representations.html.En outre, le Jersey est de vérifier qu'une exception mapper, qui est aussi proche que possible de la levée d'une exception (à partir de
org.glassfish.jersey.internal.ExceptionMapperFactory
):J'avais donc besoin de carte exactement l'exception et non plus exception générale.
À la fin, mon fournisseur se présente comme suit:
J'ai utilisé "jackson-jaxrs-json-fournisseur 2.8.8" et JAX-RS 2.0
Classe d'Application - vous besoin d'enregistrer votre ExceptionMapper mise en œuvre de la classe:
ExceptionMapper implémentation de la classe:
J'ai eu le même problème et de le résoudre en substituant l'ExceptionMapper. Parfait! Une autre petite chose que je devais faire et n'ont pas la compréhension de 100% a été comment remplacer la JacksonProvider pour ma demande (je ne sais pas si c'était lié à Jersey est la version que j'ai été aide - 2.19). Voici mon web.xml la partie qui la remplace: