web-dev-qa-db-fra.com

Est-il possible d'avoir des valeurs RequestParam vides utilisant la valeur par défaut?

si j'ai un mappage de requête similaire à celui-ci:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}

Et appelez ensuite cette demande avec:

http://example.com/test?i=

Je reçois le message d'erreur

Impossible de convertir la valeur de type 'Java.lang.String' en type 'int'; L'exception imbriquée est Java.lang.NumberFormatException: pour la chaîne d'entrée: "" '

Je peux résoudre ce problème en empêchant le client javascript d'envoyer des paramètres vides ou en acceptant les valeurs de chaîne et en n'analysant que si elles ne sont pas vides.

UPDATE: Les versions ultérieures de Spring implémentent maintenant le comportement souhaité à l'origine.

Je viens de tester cela au printemps 4.3.5 et j'ai constaté que le comportement va maintenant transformer la valeur null en valeur par défaut sans générer de NumberFormatException, donc; ma cartographie originale fonctionne maintenant bien.

Je ne sais pas quelle version du printemps ce changement de comportement a été effectué.

104
Brett Ryan

Vous pouvez changer le type @RequestParam en Integer et le rendre non requis. Cela permettrait à votre demande de réussir, mais elle serait alors nulle. Vous pouvez explicitement le définir sur votre valeur par défaut dans la méthode du contrôleur:

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", required=false) Integer i) {
    if(i == null) {
        i = 10;
    }
    // ...
}

J'ai supprimé la valeur par défaut de l'exemple ci-dessus, mais vous souhaiterez peut-être l'inclure si vous vous attendez à recevoir des demandes où elle n'est pas définie du tout:

http://example.com/test
151
Matt

Vous pouvez conserver le type primitif en définissant la valeur par défaut. Dans votre cas, ajoutez simplement la propriété "required = false" :

@RequestParam(value = "i", required = false, defaultValue = "10") int i

P.S. Cette page de la documentation de Spring pourrait être utile: Type d'annotation RequestParam

86
AppLend

Vous pouvez définir RequestParam, en utilisant la classe générique Integer au lieu de int, cela résoudra votre problème.

   @RequestParam(value= "i", defaultValue = "20") Integer i
7
Anand Tagore

Cela a été considéré comme un bug en 2013: https://jira.spring.io/browse/SPR-1018

et a été corrigé avec la version 3.2.2. Le problème ne devrait pas se produire dans les versions ultérieures et votre code devrait fonctionner correctement.

1
eis

Vous pouvez aussi faire quelque chose comme ça -

 @RequestParam(value= "i", defaultValue = "20") Optional<Integer> i
1
Tisha