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é.
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
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
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
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.
Vous pouvez aussi faire quelque chose comme ça -
@RequestParam(value= "i", defaultValue = "20") Optional<Integer> i