si j'ai un mappage de requête similaire à ce qui suit:
@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}
Et puis appelez cette demande avec:
http://example.com/test?i=
Je reçois le message d'erreur
Échec de la conversion de 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 analysant uniquement si elles ne sont pas vides.
METTRE À JOUR : Les versions ultérieures de Spring implémentent désormais le comportement initialement souhaité.
Je viens de tester cela au printemps 4.3.5 et j'ai constaté que le comportement transformera en fait la valeur nulle en valeur par défaut sans augmenter un NumberFormatException
, donc; ma cartographie d'origine fonctionne maintenant très bien.
Je ne sais pas quelle version du printemps ce changement de comportement a été effectué.
la source
String
type fourni accidentellement . user902383, c'est correct, mais pour une valeur entière, je préférerais qu'une valeur nulle / vide utilise à la place la valeur par défaut.Réponses:
Vous pouvez changer le type @RequestParam en Integer et le rendre inutile. Cela permettrait à votre demande de réussir, mais elle serait alors nulle. Vous pouvez le définir explicitement sur votre valeur par défaut dans la méthode du contrôleur:
J'ai supprimé defaultValue de l'exemple ci-dessus, mais vous souhaiterez peut-être l'inclure si vous prévoyez de recevoir des demandes où il n'est pas du tout défini:
la source
Vous pouvez conserver le type primitif en définissant la valeur par défaut, dans votre cas, ajoutez simplement la propriété "required = false" :
PS Cette page de la documentation Spring peut être utile: Type d'annotation RequestParam
la source
/test?i=
et depuisi
est vide, j'ai la valeur par défaut.defaultValue
été fourni,required == false
implicitementdefaultValue
il ne prend pas effet.Vous pouvez définir RequestParam, en utilisant la classe générique Integer au lieu de int, cela résoudra votre problème.
la source
Vous pouvez également faire quelque chose comme ça -
la source
Cela a été considéré comme un bogue en 2013: https://jira.spring.io/browse/SPR-10180
et a été corrigé avec la version 3.2.2. Le problème ne devrait se produire dans aucune version après cela et votre code devrait fonctionner correctement.
la source