2008-11-12 12 views
15

Ich versuche, eines meiner Modellobjekte an die Felder eines Formulars zu binden, mithilfe von Spring-MVC. Alles funktioniert gut, außer dass eines der Attribute des Modellobjekts eine ungeordnete Sammlung ist. Etwas zu tun, wieWie binden ich Auflistungsattribute an ein Formular in Spring MVC

<c:forEach items="${m.items}" var="i" varStatus="itemsRow"> 
     <form:input path="items[${itemsRow.index}]"/> 
    </c:forEach> 
    <form:errors path="items" /> 

funktionieren würde für eine List-type-Eigenschaft in Ordnung, aber für ein Set eines Fehler wirft, wenn nach einreichen, versucht er Eingabefeld Inhalt zu binden Attribute zu widersprechen.

Gibt es etwas im Frühling, das mit Sets funktioniert?

+0

ich misre Ad die Frage, die erste Zeit und bin nicht vertraut mit dem Pfadattribut wie das. – zmf

+0

heh!Schau mich nicht an, ich habe das nur probiert, weil es sich bei einigen zufälligen Google-Suchen herausgestellt hat. Ich lerne Frühling durch Versuch und Irrtum ;-) – agnul

Antwort

5

Ich denke, es muss eine geordnete Sammlung sein. Zum Beispiel gibt es in der Spring-Referenz, die darüber spricht, wie Eigenschaften referenziert werden. Es heißt:

Konto [2] Gibt das dritte Element des indizierten Eigenschaft-Konto an. Indizierten Eigenschaften können vom Typ Array, Liste oder anderen natürlich bestellt Sammlung (Schwerpunkt ihrer) seine

Vielleicht ein Ansatz wäre, einen Getter zu Ihrem Objekt hinzufügen, dass, anstatt Ihr Set zurückkehren, kehrt Set.toArray(). Dann würde das Elementattribut auf das Array verweisen. Natürlich können Sie sich nicht auf die Bestellung verlassen.

+1

Ich könnte einen Dekorateur um das Modellobjekt herum verwenden ... sieht nach einer guten Idee aus. – agnul

1

Ich bin nicht klar, wie genau das gebunden wird, aber es funktioniert für meine Zwecke.

<c:forEach items="${items}" var="i" varStatus="itemsRow"> 
     <input name="items[${itemsRow.index}].fieldName" type="text"/> 
    </c:forEach> 
<form:errors path="items" /> 
+2

lustig, wie das Vermeiden des Formulars:/path stuff den Fehler vermeidet. – bmargulies

+0

Der Grund für dieses Verhalten wird hier erklärt: http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/ – Alex

3

Ich denke der Grund, dass es nicht mit einem Set funktioniert, ist, weil die Reihenfolge eines Satzes nicht garantiert ist. Wenn Sie versuchen, an das erste Objekt beim Post zu binden, war es möglicherweise nicht das erste Objekt in dieser Liste, das gerendert wurde. Beispielsweise sind die Elemente [0] möglicherweise nicht identisch zwischen dem GET und dem POST.

So sollte es gut funktionieren, wenn Sie eine Implementierung von Set verwenden, die sortiert ist, wie SortedSet oder TreeSet.

+0

Ich habe es einfach versucht. SortedSet ist eine Schnittstelle, daher können Sie diese nicht verwenden und TreeSet scheint das Problem nicht zu beheben. –

+0

Ich hatte gerade das gleiche Problem, habe diese Frage gefunden, mein Formularelement in ein TreeSet geändert und es funktioniert! Danke, dass du mir viel Zeit gespart hast! – nont

1

Sie könnten versuchen, Ihren eigenen benutzerdefinierten Editor zu schreiben, um die Aufgabe auszuführen, und dann den Editor beim Controller für das Formular registrieren. Sie müssten sich nicht darum kümmern, die Elemente im Set so zu indizieren. Und wie bereits erwähnt, können Sie die Sortierung der Elemente mit SortedSet sicherstellen, wenn Sie die Elemente sortieren können.

-1

Sie können eine durch Semikolons getrennte Liste verwenden, wenn Sie numerische Referenzen auf die IDs von Objekten verwenden und eine entsprechende Konverterimplementierung registriert ist.

POST-Daten leaderboards = 1,2

Converter Implementierung (ignorieren das Zeug JSON)

public final class LeaderboardConverter extends JsonDeserializer<Leaderboard> implements Converter<String, Leaderboard> 
    { 
     public Leaderboard convert(String source) throws IllegalArgumentException 
     { 
      Leaderboard activity = new Leaderboard(); 
      activity.setId(new Integer(source)); 
      return activity; 
     } 


     public Leaderboard deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException 
     { 
      return convert(jp.getText()); 
     } 

} 
Verwandte Themen