2017-12-02 3 views
0

Ich habe gerade angefangen, mit Kotlin und Spring Boot herumzuspielen und entschied mich, einen einfachen Endpunkt zu schreiben, der eine form-urlencodierte POST-Anfrage annimmt. Ich hatte keine Lust, eine tatsächliche Datenklasse für den Körper zu schreiben, also versuchte ich, eine Karte für den Körper zu verwenden, in der Hoffnung, dass ich einfach auf Schlüssel/Wert-Paare zugreifen konnte. Ich habe versucht, zuerst:Kotlin Spring Boot form-urlencodierte POST-Anfragen mit einer Karte

@RestController 
class MyController { 

    @RequestMapping(value = "/endpoint", method = arrayOf(RequestMethod.POST), 
      consumes = arrayOf("application/x-www-form-urlencoded")) 
    fun myEndpoint(@RequestBody body: Map<String,String>): String { 

     // Do stuff 
    } 
} 

Aber das führte zu einem 415 Fehler zu nicht unterstützten Medientyp ..., die ich war wegen der Verwendung von @RequestBody und form-urlencoded POSTs lesen. Ich versuchte anschließend stattdessen die @ModelAttribute verwenden, aber dann erhielt

instanziiert fehlgeschlagen [java.util.Map]: Die angegebene Klasse ist eine Schnittstelle

Kaum überraschend, da ich völlig Hacking war. Ich habe es auch ohne Anmerkungen für den Körper versucht, aber dann wurde keiner der Formparameter injiziert. Ich weiß, dass ich eine Datenklasse hinzufügen könnte, um das zu lösen, aber ich würde gerne wissen, ob dies generisch mit einer Map gemacht werden kann, wie ich es vorher in Java getan habe.

Danke.

Antwort

1

Sie benötigen body param mit @RequestParam

@RequestMapping(value = "/endpoint", method = [(RequestMethod.POST)], 
        consumes = [MediaType.APPLICATION_FORM_URLENCODED_VALUE]) 
    fun myEndpoint(@RequestParam body: Map<String,String>): String { 

     return //... 
    } 

(Beachten Sie auch, dass ich die arrayOf Anrufe für Array-Literale entfernt, die Anmerkungen als Kotlin verfügbar sind 1.2) mit Anmerkungen versehen

Verwandte Themen