J'utilise le printemps WebMVC pour fournir une API de repos. J'utilise des méthodes telles que
Lorsque le client met mal à tort une chaîne à la place d'un ID entier dans la requête, je reçois une énorme formatxception comme: p> ma question est maintenant, comment puis-je l'attraper avec élégance? Sachez que le printemps fournit @ExptionHandler Annotations mais je ne veux pas attraper la NFE en général. Je veux pouvoir attraper toute exception analysée afin de présenter un bon message d'erreur au client. P> idées? p> acclamations, p> janvier p> p> @RequestMapping ("/ chemin ({id}") void getBydId (@pathvariable ("id") int ID) {} code> méthodes. P>
5 Réponses :
Je ne suis pas sûr de savoir si cela fonctionne pour savoir si cela fonctionne pour @pathvaribale de code> ou non, mais généralement pour la liaison de modèle, vous pouvez utiliser un objet BindingResult code> à côté de la variable de votre chemin et L'erreur de modèle et d'analyse sera ajoutée à l'objet BindingResult / Erreurs Code>. p>
J'ai fait des recherches mais je n'ai pas pu trouver un lien entre PathVariable et BindingResult. Quelqu'un d'autre?
est-ce que l'exception réelle? (Il ne correspond pas à votre exemple de code) Normalement, on pourrait s'attendre à ce que celui-ci soit enveloppé dans Si cela n'est pas assez spécifique, vous devrez renoncer à la magie de printemps et modifier simplement le type de paramètre en chaîne + l'analysez vous-même. Ensuite, vous pouvez le gérer comme vous le souhaitez. P> org.springframework.beans.typeMismatchException code> qui est probablement suffisamment spécifique que vous pouviez écrire un @exceptionHandler code> méthode pour cela. p>
Oui, je m'attendais à la même chose, mais la NFE est l'exception root. Et je suis désolé de mélanger longtemps et d'INT dans mon exemple.
Peut-être que je fais cela parce que je suis un vieux programmeur de tybe, mais j'utilise Bien que ce ne soit pas le moyen "printemps" de le faire, je le recommande, car il est facile pour moi et facile pour mes futures programmeurs de maintenance offshore à comprendre. P> chaîne code> comme type pour tous @pathvariable code> et @RequestParamètre code> Paramètres alors je fais l'analyse à l'intérieur de la méthode du gestionnaire. Cela me permet d'attraper facilement toutes les exceptions numerformatexception code>. P>
Jusqu'à savoir, cela ressemble à la solution préférée mais je n'aime vraiment pas cela (parce que cela impliquait beaucoup de changements). J'espère qu'il y aura une autre solution.
L'autre solution consiste à remplacer / écrire votre propre webdatabinder et lancer des exceptions plus spécifiques.
Mettre vos commentaires ensemble, j'ai essayé ce qui suit:
public class ValidatingAnnotationMethodHandlerAdapter extends AnnotationMethodHandlerAdapter {
@Override
protected ServletRequestDataBinder createBinder(HttpServletRequest request, Object target, String objectName) throws Exception {
return new ServletRequestDataBinder(target, objectName) {
@Override
public <T> T convertIfNecessary(Object value, Class<T> requiredType) throws TypeMismatchException {
try {
return super.convertIfNecessary(value, requiredType);
} catch (RuntimeException e) {
throw new ControllerException("Could not parse parameter: " + e.getMessage());
}
}
@Override
public <T> T convertIfNecessary(Object value, Class<T> requiredType, MethodParameter methodParam) throws TypeMismatchException {
try {
return super.convertIfNecessary(value, requiredType, methodParam);
} catch (RuntimeException e) {
throw new ControllerException("Could not parse parameter: " + e.getMessage());
}
}
};
}
J'ai trouvé une solution pour votre problème ici ici http: //www.coderanch.com/t/625951/spring/res-request-mbapp-parameter-type
Essayez simplement p> et non L'utilisation en état de validité entraînera 404. Je ne sais pas si la version 3.0 prend en charge cela. P> p>
Belle solution.avec le printemps actuel 4, nous utilisons @ControllerAdvice pour attraper des exceptions et c'est très pratique.
Bonne solution. BTW Cela lance HTTPeQuestMethodnotsupportedException.