2009-05-26 7 views
2

Ich habe einen mit Spring2.5 annotierten Controller, in dem ich eine Methode mit @RequestMapping (method = RequestMethod.GET) annotiert habe, die eine Logik zum Füllen des Modells ausführt.Datenbindung von @ModelAttribute mit Anmerkungen versehene Parameter

Ich habe auch eine Methode mit @RequestMapping annotiert (Methode = RequestMethod.POST), die die Anfrage ausführt. Diese Methode hat einen Annotated-Parameter @ModelAttribute, der mein eigenes Form-Pojo enthält, nennen wir es MyForm. Ich habe auch eine Initialisierungsmethode für MyForm, auch mit @ModelAttrribute kommentiert. Jetzt funktioniert alles wie erwartet: Bei einer POST-Anfrage werden die Formulardaten an MyForm gebunden und ich kann sie verarbeiten.

Das Problem ist, dass ich in der Lage sein möchte, das Formular vorzufüllen, indem Sie (GET) Anforderungsparameter übergeben. Da ich die @ ModelAttribute-Methode für MyForm habe, erhalte ich eine MyForm-Instanz in meinem Modell, aber sie wird nicht gefüllt, wenn ich sie nicht explizit als Parameter für meine GET-Methode verwende.

Warum muss ich dies tun, ist es möglich, Datenbindung auf meinem Formular für eine GET-Anfrage auf andere Weise zu erzwingen? Ich übergebe nun einfach den Parameter, aber weil er bereits im Modell ist, muss ich nichts damit anfangen, was zu einem hässlichen unbenutzten Methodenparameter führt.

[Edit: einige Codebeispiele veranschaulichen]

Der Controller, der nicht die Form auf einer Anforderung erhalten hat bevölkern:

@Controller 
public class MyController { 

    @ModelAttribute("myForm") 
    public MyForm createForm() { 
    return new MyForm(); 
    } 

    @RequestMapping(method=RequestMethod.GET) 
    public void handlePage(Model model) { 
    //Do some stuff to populate the model.... 
    } 

    @RequestMapping(method=RequestMethod.POST) 
    public void processForm(@ModelAttribute("myForm") MyForm myForm) { 
    //Process the form 
    } 
} 

Wenn ich die Methode Signatur der handlePage Methode zu ändern, es wird auf einem Erhaltungs-Anforderungs-bevölkert ...

@RequestMapping(method=RequestMethod.GET) 
public void handlePage(Model model, @ModelAttribute("myForm") MyForm myForm) { 
    //Do some stuff to populate the model.... 
} 
+0

Wenn Sie sagen, Sie haben Ihre eigene Form pojo, meinen Sie nur ein Domain-Objekt, oder? (Im Gegensatz zu einigen benutzerdefinierten Spring Form-Implementierung.) Ist auch Ihre Ansicht nur eine Standard-JSP? –

+0

Ja, du hast Recht. Nur ein Domain-Objekt. Meine Ansicht ist keine JSP, aber ich erspare Ihnen die Details der Ansichtsimplementierung (nicht meine eigene), weil ich ein Buch darüber allein schreiben kann ... –

Antwort

2

die Methode mit dem @ModelAttribute wird alle Argumente, dass @RequestMapping unterstützt haben dürfen So könnten Sie zum Beispiel so viele Argumente wie @RequestParam hinzufügen, um Ihr Befehlsobjekt oder sogar die http-Anfrage selbst zu füllen. Ich bin mir nicht sicher, ob Sie eine Instanz des Datenbinders auf dieselbe Weise erhalten können oder nicht.

die Dokumentation Lesen wieder denke ich, die Idee ist, dass die Pre-Population in der @ModelAttribute Methode wäre Datenbank getrieben, was wahrscheinlich ist, warum es nicht verbindlich keine Daten ohne geschieht das @ModelAttribute als Argument an die @RequestMapping Methode Hinzufügen .

+1

Nein, die Datenbinde ist nur in einem @InitBinder verfügbar annotierte Methode. Ich dachte auch daran ... zu schade, dass es nicht funktioniert :( Jetzt habe ich es einfach "repariert", indem ich das Model-Attribut übergeben und es mit @SuppressWarnings ("unused") kommentiert habe. –

Verwandte Themen