it-swarm.com.de

Können leere RequestParam-Werte den Standardwert verwenden?

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 bekomme 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 dieses Problem lösen, indem ich den Javascript-Client daran hindere, leere Parameter zu senden, oder indem ich Zeichenfolgenwerte akzeptiere und nur dann syntaktisch analysiere, wenn festgestellt wird, dass 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 dass ein NumberFormatException ausgelöst wird. Mein ursprüngliches Mapping funktioniert jetzt einwandfrei.

Ich bin nicht sicher, in welcher Version des Frühlings diese Verhaltensänderung vorgenommen wurde.

104
Brett Ryan

Sie können den Typ @RequestParam in eine Ganzzahl ändern und dafür sorgen, dass er nicht erforderlich ist. Dies würde es Ihrer Anfrage ermöglichen, erfolgreich zu sein, aber es wäre dann null. Sie können ihn in der Controller-Methode explizit auf Ihren Standardwert setzen:

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

Ich habe den Standardwert 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:

http://example.com/test
151
Matt

Sie können den primitiven Typ beibehalten, indem Sie den Standardwert festlegen. Fügen Sie in Ihrem Fall einfach die Eigenschaft "required = false" hinzu:

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

P.S. Diese Seite aus der Spring-Dokumentation könnte nützlich sein: Annotation Type RequestParam

86
AppLend

Sie können RequestParam festlegen, indem Sie anstelle von int die generische Klasse Integer verwenden. Dadurch wird Ihr Problem behoben.

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

Dies wurde 2013 als Fehler angesehen: https://jira.spring.io/browse/SPR-1018

und wurde mit Version 3.2.2 behoben. Das Problem sollte danach in keiner Version mehr auftreten und Ihr Code sollte einwandfrei funktionieren.

1
eis

Sie können auch so etwas tun -

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