Printemps de Démarrage RESTE du service de la gestion des exceptions
Je suis en train de mettre en place une grande échelle des services REST serveur. Nous sommes à l'aide de Spring Boot 1.2.1 Printemps 4.1.5, et Java 8. Nos contrôleurs sont la mise en œuvre de @RestController et le standard @RequestMapping annotations.
Mon problème est que le Printemps de Démarrage met en place une redirection par défaut pour le contrôleur des exceptions à /error
. À partir de la documentation:
Printemps Boot donne une erreur de mappage par défaut qui gère toutes les erreurs d'une manière sensible, et il est enregistré en tant que "global" page d'erreur dans le conteneur de servlet.
À venir à partir des années à écrire des applications REST avec Node.js, c'est, pour moi, rien, mais sensible. Toute exception à un point de terminaison de service génère devrait revenir dans la réponse. Je ne comprends pas pourquoi vous souhaitez envoyer une redirection vers ce qui est le plus probable Angulaire ou JQuery SPA consommateur, qui est seulement à la recherche d'une réponse et qui ne peuvent pas ou ne veulent pas prendre des mesures sur une redirection.
Ce que je veux faire est d'installer un gestionnaire d'erreurs globales qui peut prendre n'importe quelle exception - soit délibérément jeté d'une demande de la méthode de cartographie ou de l'auto-généré par un Ressort (erreur 404 si aucun gestionnaire méthode est trouvée pour le chemin de la requête de signature), et revenir à un format standard la réponse d'erreur (400, 500, 503, 404) pour le client, sans MVC redirections. Plus précisément, nous allons prendre de l'erreur, connectez-vous à NoSQL avec un UUID, puis retour au client un droit code d'erreur HTTP avec l'UUID de l'entrée de journal dans le JSON corps.
Les docs ont été vague sur la façon de le faire. Il me semble que vous devez soit créer votre propre ErrorController mise en œuvre ou l'utilisation ControllerAdvice d'une certaine façon, mais tous les exemples que j'ai vu encore comprendre la transmission de la réponse à un certain genre d'erreur de cartographie, ce qui n'aide pas. Autres exemples suggèrent que vous auriez à la liste de chaque type d'Exception vous souhaitez gérer au lieu de simplement l'inscription "Lancer" et de tout.
Quelqu'un peut me dire ce que j'ai raté, ou me diriger dans la bonne direction sur la façon de le faire sans ce qui suggère la chaîne Node.js serait plus facile de traiter avec?
- Le client n'est jamais réellement envoyé une redirection. La redirection est géré en interne par le conteneur de servlet (ex: Tomcat).
- Retrait de la @ResponseStatus annotations sur mes gestionnaires d'exception était ce dont j'avais besoin; voir stackoverflow.com/questions/35563968/...
Vous devez vous connecter pour publier un commentaire.
Nouvelle réponse (2016-04-20)
À L'Aide De Spring Boot 1.3.1.COMMUNIQUÉ de
Nouvelle Étape 1 - C'est facile et moins intrusif pour ajouter les propriétés suivantes pour l'application.propriétés:
Si vous travaillez avec un plein Reposant Application, il est très important de désactiver le mappage automatique des ressources statiques, car si vous utilisez le Printemps de Démarrage de la configuration par défaut pour la manipulation des ressources statiques, alors la ressource gestionnaire sera en charge de la demande (c'est décrétée et associée à /** ce qui signifie qu'il ramasse toutes les demandes qui n'ont pas été traitées par un autre gestionnaire de l'application) de sorte que le répartiteur de la servlet n'obtiendrez pas une chance de lancer une exception.
Nouvelle Réponse (2015-12-04)
À L'Aide De Spring Boot 1.2.7.COMMUNIQUÉ de
Nouvelle Étape 1 - je l'ai trouvé beaucoup moins intrusive possible de régler les "throExceptionIfNoHandlerFound" pavillon. Remplacer la DispatcherServlet remplacement de code ci-dessous (Étape 1) avec-le dans votre demande d'initialisation de la classe:
Dans ce cas, nous allons le paramétrage de l'indicateur sur la DispatcherServlet, qui préserve toutes les auto-configuration par le Printemps de Démarrage cadre.
Une chose que j'ai trouvé: le @EnableWebMvc annotation est mortelle pour le Printemps de Démarrage. Oui, cette annotation permet des choses comme être capable d'attraper tous le contrôleur des exceptions décrites ci-dessous, mais il tue aussi BEAUCOUP de l'aide de la configuration automatique qui Ressort d'Amorçage fournissent normalement. Utiliser cette annotation avec une extrême prudence lorsque vous utilisez le Printemps de Démarrage.
Réponse Originale À Cette Question:
Après beaucoup plus de recherche et de suivi sur les solutions posté ici (merci pour l'aide!) et pas de petite quantité de suivi à l'exécution dans le Ressort de code, j'ai enfin trouvé une configuration qui va gérer toutes les Exceptions (pas des Erreurs, mais lisez la suite), y compris une erreur 404.
Étape 1 - dire SpringBoot d'arrêter l'utilisation de MVC pour le "gestionnaire n'est pas trouvé" des situations. Nous voulons Printemps pour lancer une exception au lieu de renvoyer au client une vue rediriger vers "/erreur". Pour ce faire, vous devez avoir une entrée dans l'une de vos classes de configuration:
L'inconvénient de cette est qu'il remplace la valeur par défaut répartiteur de la servlet. Cela n'a pas été un problème pour nous encore, sans effets secondaires ou les problèmes d'exécution qui se montre. Si vous allez faire autre chose avec le répartiteur de servlet pour d'autres raisons, c'est l'endroit pour le faire.
Étape 2 - Maintenant que le printemps de démarrage va lever une exception si aucun gestionnaire n'est trouvé, cette exception peut être manipulé avec tous les autres dans un cadre unifié gestionnaire d'exception:
Gardez à l'esprit que je pense que le "@EnableWebMvc" annotation est importante ici. Il semble que rien de tout cela fonctionne sans elle. Et votre Printemps de démarrage app maintenant attraper toutes les exceptions, y compris une erreur 404 dans le gestionnaire de classe et vous pouvez faire ce que vous s'il vous plaît.
Un dernier point - il ne semble pas être un moyen d'obtenir ce pour attraper jeté des Erreurs. J'ai une idée loufoque de l'utilisation d'aspects pour détecter les erreurs et de les transformer en des Exceptions que le code ci-dessus peut ensuite traiter avec, mais je n'ai pas encore eu le temps de réellement essayer la mise en œuvre de cette. Espérons que cela aide quelqu'un.
Les commentaires/corrections/améliorations seront appréciées.
@ExceptionHandler
méthode appelée lors de la mise en@ControllerAdvice
classe bien qu'ils fonctionner correctement si elle est placée dans la@RestController
classe.@EnableWebMvc
est sur le@ControllerAdvice
et la@Configuration
(j'ai testé toutes les combinaisons) de la classe. Toute idée ou un exemple de travail? // @Andy Wilkinson@ControllerAdvice
peut pas être capté par la configuration de la fonction de balayage automatique définie sur la classe d'application.@EnableWebMvc
presque certainement n'est pas ce que vous voulez. Il s'éteint tout de Printemps de Démarrage de l'auto-configuration de Spring MVC. Je ne comprends pas les préoccupations concernant les redirections et les transmet à la question que le client ne voit pas tout ça. La mise en œuvre d'une coutumeErrorController
est presque certainement une meilleure façon de s'attaquer à ce problème.Avec Spring Boot 1.4+ nouveau cool classes pour faciliter la gestion des exceptions ont été ajoutées qui permet de supprimer le code réutilisable.
Une nouvelle
@RestControllerAdvice
est fourni pour la gestion des exceptions, c'est une combinaison de@ControllerAdvice
et@ResponseBody
. Vous pouvez supprimer le@ResponseBody
sur le@ExceptionHandler
méthode lors de l'utilisation de cette nouvelle annotation.c'est à dire
Pour le traitement des erreurs 404 ajoutant
@EnableWebMvc
annotation et la suite de l'application.propriétés a été assez:spring.mvc.throw-exception-if-no-handler-found=true
Vous pouvez trouver et jouer avec les sources ici:
https://github.com/magiccrafter/spring-boot-exception-handling
@RestControllerAdvice
sans configuration supplémentaire. Ce qui me manque ici?Je pense que
ResponseEntityExceptionHandler
répond à vos exigences. Un exemple de morceau de code pour HTTP 400:Vous pouvez le vérifier post
HttpRequestMethodNotSupportedException
et plugin le même bocal dans de multiples micro-services, pour certaines fins commerciales nous avons besoin pour répondre à micro-service de nom d'alias dans la réponse. est-il possible d'obtenir le sous-jacent micro-nom du service / nom du contrôleur ? Je saisHandlerMethod
fournira à la java le nom de la méthode à partir d'où l'exception est à l'origine. Mais ici, aucune des méthodes de réception de la demande, d'oùHandlerMethod
ne sera pas initialisé. Si il ya une solution pour résoudre ce problème?Bien que c'est une vieille question, je voudrais faire part de mes réflexions sur ce sujet. J'espère que ça sera utile à certains d'entre vous.
Je suis actuellement à la construction d'une API REST qui rend l'utilisation de Spring Boot 1.5.2.COMMUNIQUÉ avec le Framework Spring 4.3.7.La LIBÉRATION. J'utilise le Java Config approche (par opposition à la configuration XML). Aussi, mon projet utilise un mondial exception d'un mécanisme de gestion à l'aide de la
@RestControllerAdvice
annotation (voir ci-dessous).Mon projet a les mêmes exigences que la vôtre: je veux que mon API REST pour retourner un
HTTP 404 Not Found
avec un accompagnement de la charge utile JSON dans la réponse HTTP au client API lorsqu'il tente d'envoyer une requête à une URL qui n'existe pas. Dans mon cas, la charge utile JSON ressemble à ceci (qui se distingue clairement du Ressort de Démarrage par défaut, btw.):J'ai finalement fait le travail. Voici les principales tâches que vous devez faire en bref:
NoHandlerFoundException
est levée si l'API clientsappel d'URL pour lesquelles aucune méthode de gestionnaire existe (voir l'Étape 1 ci-dessous).
ApiError
) qui contient toutes les données qui doivent être retournés à l'API client (voir l'étape 2).NoHandlerFoundException
et renvoie un message d'erreur approprié pour le client API (voir l'étape 3).
Ok, maintenant, sur les détails:
Étape 1: configuration de l'application.propriétés
J'ai dû ajouter les deux paramètres de configuration suivants pour le projet de
application.properties
fichier:Cela permet de s'assurer, le
NoHandlerFoundException
est levée dans les cas où un client tente d'accéder à une URL pour lesquels aucune méthode de contrôleur existe qui serait en mesure de traiter la demande.Étape 2: Créer une Classe pour les Erreurs de l'API
J'ai fait une classe similaire à celle proposée dans cet article sur Eugen Paraschiv blog. Cette classe représente une erreur de l'API. Cette information est
envoyé au client, dans le corps de la réponse HTTP en cas d'erreur.
Étape 3: Créer /Configurer un Gestionnaire Global d'Exception
- Je utiliser la classe suivante pour gérer les exceptions (pour des raisons de simplicité, j'ai enlevé les déclarations d'importation, code d'enregistrement et de quelques autres, la non-pertinent morceaux de code):
Étape 4: Écrire un test
Je tiens à vous assurer, l'API renvoie toujours la correcte des messages d'erreur à l'appel du client, même en cas de défaillance. Ainsi, j'ai écrit un test comme ceci:
La
@ActiveProfiles("dev")
annotation peut être laissé à l'écart. Je ne l'utilise que comme je travaille avec des profils différents. LeRegexMatcher
est une coutume Hamcrest matcher - je utiliser pour mieux gérer les champs d'horodatage. Voici le code (je l'ai trouvé ici):Quelques notes de mon côté:
@EnableWebMvc
annotation. Ce n'était pas nécessaire dans mon cas.Ce à propos de ce code ? J'utilise un repli de la demande de cartographie d'attraper les erreurs 404.
Par défaut Printemps Boot donne json avec les détails de l'erreur.
Il travaille également pour tous les types de demande de cartographie d'erreurs. Voir cet article
http://www.jayway.com/2014/10/19/spring-boot-error-responses/
Si vous voulez créer le journal à NoSQL. Vous pouvez créer @ControllerAdvice où vous pouvez vous connecter et puis re-lancer l'exception.
Il est par exemple dans la documentation
https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
@RestControllerAdvice est une nouvelle fonctionnalité du Framework Spring 4.3 gérer Exception avec RestfulApi par une préoccupation horizontale solution:
Pour le REPOS des contrôleurs, je vous recommande d'utiliser
Zalando Problem Spring Web
.https://github.com/zalando/problem-spring-web
Si le Printemps de Démarrage vise à intégrer certains auto-configuration, cette bibliothèque n'est plus de la gestion des exceptions. Vous avez juste besoin d'ajouter la dépendance:
Et ensuite définir un ou plusieurs conseils de traits pour vos exceptions (ou utiliser ceux fournis par défaut)
Alors vous pouvez défini le contrôleur de conseils pour la gestion des exceptions comme:
Solution avec
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
et@EnableWebMvc
@ControllerAdvice
a fonctionné pour moi avec Spring Boot 1.3.1, tout n'a pas été de travailler sur 1.2.7
Pour les gens qui veulent la réponse selon le code de statut http, vous pouvez utiliser le
ErrorController
façon:La
ResponseBean
voici mon custom pojo pour la réponse.