8
votes

Prise de vue des paramètres d'analyse d'une exception dans le printemps 3.0 WebMVC

J'utilise le printemps WebMVC pour fournir une API de repos. J'utilise des méthodes telles que

@RequestMapping ("/ chemin ({id}") void getBydId (@pathvariable ("id") int ID) {} méthodes.

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: xxx

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.

idées?

acclamations,

janvier


0 commentaires

5 Réponses :


0
votes

Je ne suis pas sûr de savoir si cela fonctionne pour savoir si cela fonctionne pour @pathvaribale ou non, mais généralement pour la liaison de modèle, vous pouvez utiliser un objet BindingResult à côté de la variable de votre chemin et L'erreur de modèle et d'analyse sera ajoutée à l'objet BindingResult / Erreurs .


1 commentaires

J'ai fait des recherches mais je n'ai pas pu trouver un lien entre PathVariable et BindingResult. Quelqu'un d'autre?



2
votes

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 org.springframework.beans.typeMismatchException qui est probablement suffisamment spécifique que vous pouviez écrire un @exceptionHandler méthode pour cela.

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.


1 commentaires

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.



0
votes

Peut-être que je fais cela parce que je suis un vieux programmeur de tybe, mais j'utilise chaîne comme type pour tous @pathvariable et @RequestParamètre 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 .

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.


2 commentaires

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.



0
votes

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());
            }
        }

    };
}


0 commentaires

2
votes

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 xxx

et non L'utilisation en état de validité entraînera 404. Je ne sais pas si la version 3.0 prend en charge cela.


2 commentaires

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.