Basierend auf der Antwort auf ein Problem mit x-www-form-urlencoded mit Spring @Controller
Ich habe die folgende @ Controller-Methode geschrieben
@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST
, produces = {"application/json", "application/xml"}
, consumes = {"application/x-www-form-urlencoded"}
)
public
@ResponseBody
Representation authenticate(@PathVariable("email") String anEmailAddress,
@RequestBody MultiValueMap paramMap)
throws Exception {
if(paramMap == null || paramMap.get("password") == null) {
throw new IllegalArgumentException("Password not provided");
}
}
Die Anfrage, auf die mit dem folgenden Fehler fehlschlägt
{
"timestamp": 1447911866786,
"status": 415,
"error": "Unsupported Media Type",
"exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
"message": "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
"path": "/users/usermail%40gmail.com/authenticate"
}
[PS: Jersey war weitaus freundlicher, konnte es aber angesichts der praktischen Einschränkungen hier nicht verwenden]
spring
spring-mvc
model-view-controller
Somasundaram Sekar
quelle
quelle
JSON.stringify({"ordersToDownload":"00417002"}
$.ajax({url:"/myurl", type:"POST", data: JSON.stringify({"someAttribute":"someData"}) })
Antworten:
Das Problem ist, dass Spring es bei Verwendung von application / x-www-form-urlencoded nicht als RequestBody versteht. Wenn wir dies verwenden möchten, müssen wir die Annotation @RequestBody entfernen .
Versuchen Sie dann Folgendes:
Beachten Sie, dass die Anmerkung @RequestBody entfernt wurde
Antwort : HTTP-Post-Anfrage mit Inhaltstyp application / x-www-form-urlencoded funktioniert im Frühjahr nicht
quelle
application/x-www-form-urlencoded
?@ModelAttribute, even though this behaviour is (sadly) not documented. And
@ModelAttribute haben. X-www-form-urlencodedEs scheint, dass Sie jetzt nur den Methodenparameter mit markieren können
@RequestParam
und er die Arbeit für Sie erledigt.quelle
Fügen Sie Ihrer Anfrage einen Header hinzu, um den Inhaltstyp auf application / json festzulegen
Auf diese Weise weiß Spring, wie man den Inhalt analysiert.
quelle
Im Frühjahr 5
quelle
Das einfache Entfernen von
@RequestBody
Anmerkungen löst das Problem (getestet auf Spring Boot 2):quelle
Ich habe in dieser StackOverflow-Antwort über eine Alternative geschrieben .
Dort schrieb ich Schritt für Schritt und erklärte mit Code. Der kurze Weg:
Erstens : Schreiben Sie ein Objekt
Zweitens : Erstellen Sie einen Konverter für die Zuordnung des Modells, das den AbstractHttpMessageConverter erweitert
Drittens : Weisen Sie Spring an, diesen Konverter zu verwenden, der eine WebMvcConfigurer.class implementiert, die die configureMessageConverters-Methode überschreibt
Viertens und endgültig: Wenn Sie diese Implementierungseinstellung in der Zuordnung in Ihrem Controller verwenden, verbrauchen Sie = MediaType.APPLICATION_FORM_URLENCODED_VALUE und @RequestBody vor Ihrem Objekt.
Ich benutze Spring Boot 2.
quelle