Kann ich @Requestparam annotation für eine Post-Anforderung?
Habe ich diese controller-Methode:
@PostMapping(
value = "/createleave",
params = {"start","end","hours","username"})
public void createLeave(@RequestParam(value = "start") String start,
@RequestParam(value = "end") String end,
@RequestParam(value = "hours") String hours,
@RequestParam(value = "username") String username){
System.out.println("Entering createLeave " + start + " " + end + " " + hours + " " + username);
LeaveQuery newLeaveQuery = new LeaveQuery();
Account account = accountRepository.findByUsername(username);
newLeaveQuery.setAccount(account);
newLeaveQuery.setStartDate(new Date(Long.parseLong(start)));
newLeaveQuery.setEndDate(new Date(Long.parseLong(end)));
newLeaveQuery.setTotalHours(Integer.parseInt(hours));
leaveQueryRepository.save(newLeaveQuery);
}
Aber wenn ich Sie senden eine post-Anforderung zu diesem Endpunkt erhalte ich folgende
"{"timestamp":1511444885321,"status":400,"error":"Bad Request","exception":"org.springframework.web.bind.UnsatisfiedServletRequestParameterException","message":"Parameter conditions \"start, end, hours, username\" not met for actual request parameters: ","path":"/api/createleave"}"
Wenn ich entfernen Sie die params-argument aus der @PostMapping
annotation bekomme ich eine Allgemeine Fehlermeldung, er wird sagen, dass es nicht finden können, das erste erforderliche parameter (start), während es wirklich ist senden Sie zusammen mit den Parametern end -, Stunden-und Benutzernamen.
how to get param-Methode in post spring mvc?
Gelesen habe ich in diesem Beitrag, dass @RequestParam
können nur verwendet werden für get-Methoden, aber wenn ich es entfernen @RequestParam
und stick mit den params argument der @PostMapping
Anmerkung es funktioniert immer noch nicht. Ich weiß, dass ich verwenden können @RequestBody
aber ich will nicht, um eine Klasse, die nur für diesen 4 Parametern. Kann mir jemand sagen, wie ich diese Arbeit machen?
Danke
EDIT: ich lese hier https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params--, dass das argument params nicht genau das, was ich dachte, es war. Es scheint, als Bedingung. Wenn ein Satz von Parametern entsprechen, einen Wert hat dann der Endpunkt-controller-Methode aktiviert werden.
- Ausgehend von der Fehlermeldung und den code gepostet der code passt nicht zu der Ausnahme.
- Dein Verständnis ist falsch. Sie können
@RequestParam
mit jeder Art von Anfrage.@RequestBody
ist, wenn Sie post einen Körper (in JSON, XML etc), und wollen Sie es gemarshallt, um ein Objekt. Wenn Sie nur wollen, um die Parameter zu verwenden, dann@RequestBody
ist ziemlich nutzlos. Aber die Bindung an ein Objekt sollte bevorzugt werden, die über getrennte Parameter, und für diese sollten Sie verwenden@ModelAttribute
. - die anderen sagen
@RequestParam
kann nicht verwendet werden, mit post-Anfragen - Sie sind falsch... (geschrieben Haben 3 Bücher über das Thema ich bin mir ziemlich sicher, dass ich weiß, wovon ich spreche 🙂 ). Parameter sind Parameter, die unabhängig von der Methode verwendet, um Sie auf den server. Sie können auch verwendet werden, um die Parameter form, bei der Buchung ein Formular. Nun, wenn Sie würde das versenden JSON-das wäre eine andere Geschichte, da ist ein Körper und sollte analysiert werden, mit
@RequestBody
. - dann kommen wie bekomme ich einen Fehler wenn ich @RequestParam im obigen Beispiel? Was muss ich ändern, damit es funktioniert? Bitte erleuchte mich.
- Der Fehler ist nicht über die
@RequestParam
aber die Bedingungen (dieparams
im@RequestMapping
) und wie gesagt ich denke, der code hier gepostet ist nicht der eigentliche code...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie fordern, ist grundlegend falsch. POST-requests sendet Daten in einem Körper Nutzlast, die zugeordnet ist, über
@RequestBody
.@RequestParam
wird verwendet, um anzeigen, Daten über die URL Parameter wie/url?start=foo
. Was Sie versuchen zu tun, ist mit@RequestParam
um den job zu erledigen von@RequestBody
., Alternative Lösungen für die REST-Controller
@RequestBody Map<String, String> payload
. Werden Sie sicher, dass'Content-Type': 'application/json'
in Ihrer Anfrage-header.@RequestParam
verwenden Sie eine GET-Anforderung statt und senden Sie Ihre Daten per URL-Parameter.Alternative Lösungen für den MVC-Controller
@ModelAttribute
.@RequestBody Map<String, String> payload
. Um dies zu tun, bitte sehen diese Antwort.Ist es nicht möglich, die Karte Daten in das Formular kodierte Daten direkt an einen
Map<String, String>
.@RequestBody
ist nur nützlich ist Sie tatsächlich senden Sie eine Nutzlast anderen bilden dann die Codierung (wie JSON oder XML) für eine einfach form post@RequestBody
wird nichts tun, dann haben Sie entweder@ModelAttribute
oder verwenden Sie@RequestParam
zu erhalten, die form-Parameter. Wie gesagt@RequestParam
beschränkt sich nicht auf den GET-Methoden.Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize instance of java.lang.String out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappin gException: Can not deserialize instance of java.lang.String out of START_OBJECT token
Fehler. Irgendeine Idee, wie kann ich verhindern, dass dieser Fehler passiert?@RequestBody
wird nicht funktionieren, da ich bereits...ModelAttribute
ist ein Spring-annotation, so können Sie es nicht verwenden, außerhalb der Spring-Anwendung.'Content-Type': 'application/json'
imheaders
wenn ich die post. So werden die RequestBody Karte wird gefüllt mit den Parametern richtig.Sollten Sie verwenden
@RequestBody
anstatt@RequestParam
Und Sie sollten ganze Objekt als Körper der Anfrage
@RequestParam
ist für GET und nicht POST-Methodekönnen Sie etwas tun, wie
public saveUser(@RequestBody User user) { do something with user }
und es wird abgebildet als User-Objekt beispielsweise
Gut, ich denke, die Antwort von @Synch ist grundlegend falsch, und nicht die Frage.
@RequestParam
in einer Menge von Szenarien erwartet, entweder GET oder POST HTTP-Nachrichten, und ich möchte sagen, dass es funktioniert völlig in Ordnung;paramname=paramvalue
Schlüssel-Wert-Zuordnung(en) gleichermaßen (siehe POST Message Körper-Typen hier);docs.spring.io
eine offizielle Quelle für den Frühling Dokumentation, klar, dass:So, ich denke, die Antwort ist JA, können Sie
@RequestParam
annotation mit@Controller
Klasse, Methode, parameter, solange die Methode request-abgebildet durch@RequestMapping
rechnen Sie nicht Objekt, dies ist vollkommen legal und es gibt nichts falsch mit ihm.Dies ist für multipart/form-data, enctype-post-Anforderung.