2012-04-13 19 views
2

Ich arbeite an einer Testanwendung mit Spring MVC. Ich habe eine Person Klasse und eine Group Klasse. Jedes Objekt Person verweist auf ein Objekt Group.Objekte, die im Frühjahr MVC-Formular binden

Jetzt habe ich eine JSP implementiert, die Personendaten anzeigen und bearbeiten zulassen. Innerhalb meiner Form habe ich eine Auswahlsteuer der Pearsons Gruppe wählen:

<sf:select path="group"> 
    <sf:options items="${groupList}" itemLabel="name" itemValue="id" /> 
</sf:select> 

Es zeigt die richtige Gruppe, wenn ich die Seite zu laden, aber ich kann Änderungen nicht speichern, weil in der Steuerung ich die Gruppe nur die Zeichenfolge erhalten darstellen ID.

Also, meine Frage ist: Wie kann ich ein Group Objekt anstelle seiner ID in meinem Controller erhalten?

UPDATE Hier mein Controller-Code:

@RequestMapping(value = "/details", params = "save", method = RequestMethod.POST) 
public String save(@ModelAttribute("person") Person p, 
     BindingResult result) { 
    this.personManager.savePerson(p); 
    return "redirect:/people/details?id=" + p.getId(); 
} 

Antwort

6

Erstellen Sie Ihre eigenen GroupEditor durch die Erweiterung PropertyEditorSupport (das wird die Gruppe Objektinstanz correcty bevölkern). Dann, dass binden in Ihrem Controller:

@InitBinder 
protected void initBinder(WebDataBinder binder)  { 
     binder.registerCustomEditor(Group.class, new GroupEditor(groupService)); 
} 

und Ihren tatsächlichen Editor somethign aussehen könnte wie folgt aus:

public class GroupEditor extends PropertyEditorSupport{ 

    private final GroupService groupService; 

    public GroupEditor(GroupService groupService){ 
     this.groupService= groupService; 
    } 

    @Override 
    public void setAsText(String text) throws IllegalArgumentException { 
     Group group = groupService.getById(Integer.parseInt(text)); 
     setValue(group); 
    } 
} 

Spring docs

+0

ich meine Frage aktualisiert ... – davioooh

+0

Was muss ich ändern in meine Methodensignatur? Muss ich diesen Weg ändern? 'public String speichern (@ModelAttribute (" person ") Person p, Gruppe g, BindingResult Ergebnis)'? – davioooh

+0

Nichts, wenn es die gleiche wie Ihre ursprüngliche Frage ist. Das Bindungsergebnis ist nur notwendig, wenn Sie es validieren ... – NimChimpsky