Angenommen, ich habe eine Seite, auf der die Objekte in einer Tabelle aufgelistet sind, und ich muss ein Formular einfügen, um die Tabelle zu filtern. Der Filter wird als Ajax GET an eine folgende URL gesendet: http://foo.com/system/controller/action?page=1&prop1=x&prop2=y&prop3=z
Und anstatt viele Parameter auf meinem Controller zu haben, wie:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "prop1", required = false) String prop1,
@RequestParam(value = "prop2", required = false) String prop2,
@RequestParam(value = "prop3", required = false) String prop3) { ... }
Und angenommen, ich habe MyObject als:
public class MyObject {
private String prop1;
private String prop2;
private String prop3;
//Getters and setters
...
}
Ich möchte so etwas tun wie:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }
Ist es möglich? Wie kann ich das machen?
java
spring-mvc
Renanleandrof
quelle
quelle
@ModelAttribute
, Spring MVC - Formular Beispiel Handhabung . Google einfach " Spring MVC Form Handling " und du bekommst eine Menge Tutorials / Beispiele. Verwenden Sie jedoch unbedingt die moderne Art der Formularbearbeitung, z. B. Spring v2.5 +@ModelAttribute
im Frühjahr MVCAntworten:
Sie können dies
@RequestParam
auf jeden Fall tun. Entfernen Sie einfach die Anmerkung. Spring bindet Ihre Anforderungsparameter sauber an Ihre Klasseninstanz:quelle
MyObject
, auf ähnliche Weise wie bei @RequestParam?MyObject
Abfrageparameter in Snake Fall zu übernehmen und es zu einem Kamel Fall Mitglied der KarteMyObject
. Sollte zum Beispiel?book_id=4
mitbookId
Mitglied desMyObject
?Ich werde ein kurzes Beispiel von mir hinzufügen.
Die DTO-Klasse:
Anforderungszuordnung innerhalb der Controller-Klasse:
Abfrage:
Ergebnis:
Ich hoffe, es hilft :)
UPDATE / KOTLIN
Da ich derzeit viel mit Kotlin zusammenarbeite, sollte die Klasse in Kotlin die folgende Form haben, wenn jemand ein ähnliches DTO definieren möchte:
Mit der
data
Klasse wie dieser:Die Feder (im Boot getestet) gibt den folgenden Fehler für die in der Antwort erwähnte Anforderung zurück:
Die Datenklasse funktioniert nur für das folgende Anforderungsparameterformular:
Sei dir dessen bewusst!
quelle
Ich habe ein sehr ähnliches Problem. Eigentlich ist das Problem tiefer als ich dachte. Ich verwende jquery,
$.post
dasContent-Type:application/x-www-form-urlencoded; charset=UTF-8
standardmäßig verwendet wird. Leider habe ich mein System darauf aufgebaut und als ich ein komplexes Objekt als brauchte@RequestParam
konnte ich es nicht einfach umsetzen.In meinem Fall versuche ich, Benutzereinstellungen mit etwas wie zu senden;
Auf der Clientseite sind die tatsächlichen Rohdaten, die an den Server gesendet werden;
analysiert als;
und die Serverseite ist;
Ich habe es versucht
@ModelAttribute
, Setter / Getter hinzugefügt, Konstruktoren mit allen Möglichkeiten dazuUserPreferences
aber ohne Chance da es die gesendeten Daten als 5 Parameter erkannte, aber tatsächlich hat die zugeordnete Methode nur 2 Parameter. Ich habe auch Bijus Lösung ausprobiert. Spring erstellt jedoch ein UserPreferences-Objekt mit dem Standardkonstruktor und füllt die Daten nicht aus.Ich habe das Problem gelöst, indem ich eine JSon-Zeichenfolge mit den Einstellungen von der Clientseite gesendet und so behandelt habe, als wäre es eine Zeichenfolge auf der Serverseite.
Klient:
Server:
Kurz gesagt, ich habe die Konvertierung manuell innerhalb der REST-Methode durchgeführt. Meiner Meinung nach ist der Grund, warum Spring die gesendeten Daten nicht erkennt, der Inhaltstyp.
quelle
@RequestMapping(method = POST, path = "/settings/{projectId}") public void settings(@PathVariable String projectId, @RequestBody ProjectSettings settings)
Da die Frage zum Festlegen von obligatorischen Feldern unter jedem Beitrag auftaucht, habe ich ein kleines Beispiel zum Festlegen von Feldern nach Bedarf geschrieben:
quelle
Während Antworten , die Bezug zu nehmen
@ModelAttribute
,@RequestParam
,@PathParam
und Ähnliches gültig sind, gibt es eine kleine Gotcha ich in lief. Der resultierende Methodenparameter ist ein Proxy, den Spring um Ihr DTO legt. Wenn Sie also versuchen, es in einem Kontext zu verwenden, der Ihren eigenen benutzerdefinierten Typ erfordert, erhalten Sie möglicherweise einige unerwartete Ergebnisse.Folgendes wird nicht funktionieren:
In meinem Fall führte der Versuch, es in der Jackson-Bindung zu verwenden, zu a
com.fasterxml.jackson.databind.exc.InvalidDefinitionException
.Sie müssen ein neues Objekt aus dem dto erstellen.
quelle
Ja, Sie können es auf einfache Weise tun. Siehe unten Code der Zeilen.
URL - http: // localhost: 8080 / get / request / multiple / param / by / map? Name = 'abc' & id = '123'
quelle
Akzeptierte Antworten funktionieren wie ein Zauber, aber wenn das Objekt eine Liste von Objekten enthält, funktioniert es nicht wie erwartet. Hier ist meine Lösung nach einigem Graben.
Nach diesem Thread- Ratschlag habe ich Folgendes getan.
Es ist nicht das Beste zum Debuggen Ihrer API mit Postman, aber es funktioniert wie erwartet für mich.
Und hier die SearchFilterDTO und FilterDTO
quelle