2009-04-01 8 views
6

Ich versuche ein Formular zum Bearbeiten einer vorhandenen Datenbankzeile zu erstellen. Ich verwende das Spring MVC Form-Tag, um die HTML automatisch an ein Formular-Backing-Objekt zu binden. Die Zeile hat eine Viele-zu-Viele-Beziehung mit einer anderen Tabelle, die ich mit einer Mehrfachauswahlbox darzustellen versuche, indem ich das form: select-Tag verwende;Spring MVC Formular: Wählen Sie Tag, Mehrfachauswahl nicht korrekt?

<form:select path="rules"> 
    <form:options items="${bundle.rules}" itemValue="name" itemLabel="name"/> 
</form:select> 

Ich verwende Hibernate für die Persistenz so die Beziehung innerhalb des Bundle pojo repräsentieren als HashSet ist.

private Set<Rule> rules = new HashSet<Rule>(0); 

Ohne die Auswahlbox auf der Seite, wird das Objekt in der Datenbank aktualisieren korrekt, aber mit dem Auswahlfeld aktualisieren, wird das Objekt nicht in die Datenbank und ich erhalte diesen Fehler in meinem log4j Log, beachten Sie, dass Dieser Fehler verursacht keine Ausnahme, er ist nur in den Protokollen sichtbar.

Dies geschieht unabhängig davon, ob ich Elemente in der Auswahlbox abwählen, das gesamte Formular verweigert die korrekte Übermittlung. Kann mir jemand helfen?

Ich bin bewusst, How do I bind collection attributes to a form in Spring MVC, die dieser Frage ähnlich ist, schien leider keiner der Vorschläge zu meinem Problem nützlich.

+0

Sieht aus wie einige Ihrer Fehlermeldung abgeschnitten wurde - haben Sie mehr von dem Fehler? Eine Stapelverfolgung? –

+0

Nun, aus irgendeinem Grund ist die Nachricht auf der Debug-Ebene. Es ist nicht wirklich eine Ausnahme. Ich habe falsch geschrieben, als ich eine Stack-Spur erwähnte, ich werde das jetzt korrigieren. –

Antwort

8

Das Problem ist mit der Einreichung Ihres Formulars. Spring ist nicht in der Lage, ein Objekt des Befehls zu binden, daher sendet es das Formular nicht, sondern leitet Sie stattdessen an das FormularView weiter.

Wenn die Bindung erfolgreich durchgeführt wird, wird diese Meldung angezeigt, statt:

No errors -> processing submit 

Ihr Problem zu lösen, müssen Sie einen CustomCollectionEditor mit dem Controller registrieren. (Siehe hierzu link). Es wäre etwas wie folgt:

protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception 
{ 
    binder.registerCustomEditor(Set.class, "rules", new CustomCollectionEditor(Set.class) 
    { 
    protected Object convertElement(Object element) 
    { 
     String name = ""; 

     if (element instanceof String) 
      name = (String) element; 

     return name != null ? new Rule(name) : null; 
    } 
    }); 
} 
+0

Danke, leider kann ich nicht von der Arbeit auf WordPress zugreifen. Wenn Sie mehr Details veröffentlichen können, würde ich es begrüßen. –

+0

Das musste ich tun. Sobald ich dein Code-Snippet implementiert habe, hat alles funktioniert. Kannst du eine gute Lernquelle für Spring MVC empfehlen? Ich lese die Dokumentation/Tutorials auf SpringSource.org und ich kaufte das Buch Spring In Action, aber keiner hat die Tiefe, die ich brauche. –

Verwandte Themen