Wenn ich eine Anforderungszuordnung habe, die der folgenden ähnelt:
@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public void test(@RequestParam(value = "i", defaultValue = "10") int i) {
}
Und dann rufen Sie diese Anfrage mit:
http://example.com/test?i=
Ich erhalte die Fehlermeldung
Fehler beim Konvertieren des Werts vom Typ 'java.lang.String' in den Typ 'int'; verschachtelte Ausnahme ist java.lang.NumberFormatException: Für Eingabezeichenfolge: "" '
Ich kann dies lösen, indem ich entweder den Javascript-Client daran hindere, leere Parameter zu senden, oder indem ich Zeichenfolgenwerte akzeptiere und nur analysiere, wenn sie nicht leer sind.
UPDATE : Spätere Versionen von Spring implementieren jetzt das ursprünglich gewünschte Verhalten.
Ich habe dies gerade im Frühjahr 4.3.5 getestet und festgestellt, dass das Verhalten nun tatsächlich den Nullwert in den Standardwert umwandelt, ohne a zu erhöhen NumberFormatException
. Mein ursprüngliches Mapping funktioniert jetzt einwandfrei.
Ich bin nicht sicher, in welcher Version des Frühlings diese Verhaltensänderung vorgenommen wurde.
quelle
String
Typ. user902383, das ist richtig, obwohl ich für einen ganzzahligen Wert bevorzugen würde, dass ein null / leerer Wert stattdessen den defaultValue verwendet.Antworten:
Sie können den @ RequestParam-Typ in eine Ganzzahl ändern und ihn nicht erforderlich machen. Dies würde es Ihrer Anfrage ermöglichen, erfolgreich zu sein, aber dann wäre sie null. Sie können ihn in der Controller-Methode explizit auf Ihren Standardwert setzen:
Ich habe den defaultValue aus dem obigen Beispiel entfernt, aber Sie können ihn einschließen, wenn Sie erwarten, Anforderungen zu erhalten, bei denen er überhaupt nicht festgelegt ist:
quelle
Sie können den primitiven Typ beibehalten, indem Sie den Standardwert festlegen. In Ihrem Fall fügen Sie einfach die Eigenschaft "required = false" hinzu :
PS Diese Seite aus der Spring-Dokumentation kann hilfreich sein: Anmerkungstyp RequestParam
quelle
/test?i=
und dai
leer ist, habe ich den Standardwert.defaultValue
wurderequired == false
implizit zur Verfügung gestelltdefaultValue
wird er nicht wirksam.Sie können RequestParam festlegen, indem Sie die generische Klasse Integer anstelle von int verwenden. Dadurch wird Ihr Problem behoben.
quelle
Sie können auch so etwas tun -
quelle
Dies wurde 2013 als Fehler angesehen: https://jira.spring.io/browse/SPR-10180
und wurde mit Version 3.2.2 behoben. Danach sollte in keiner Version ein Problem auftreten, und Ihr Code sollte einwandfrei funktionieren.
quelle