2009-02-05 8 views
6

Lassen Sie uns sagen, dass ich den folgenden Befehl ein Objekt haben:Spring - Bindung an ein Objekt eher als ein String oder primitive

class BreakfastSelectCommand{ 
    List<Breakfast> possibleBreakfasts; 
    Breakfast selectedBreakfast; 
} 

Wie kann ich Frühling bevölkern „selectedBreakfast“ mit einem Frühstück aus der Liste?

wurde Bezifferung ich, dass ich so etwas in meiner jsp tun würde:

<form:radiobuttons items="${possibleBreakfasts}" path="selectedBreakfast" /> 

Aber dies funktioniert offenbar nicht. Irgendwelche Ideen?

Dank,

-Morgan

Antwort

8

Der Schlüssel zu allem dafür ist die Property.

Sie müssen einen PropertyEditor für Ihre Breakfast-Klasse definieren und dann den ServletDataBinder mithilfe von registerCustomEditor in der initBinder-Methode Ihres Controllers konfigurieren.

Beispiel:

public class BreakfastPropertyEditor extends PropertyEditorSupport{ 
    public void setAsText(String incomming){ 
     Breakfast b = yourDao.findById(Integer.parseInt(incomming)); 
     setValue(b); 
    } 
    public String getAsText(){ 
     return ((Breakfast)getValue()).getId(); 
    } 
} 

Anmerkung Sie werden einige null sein, um die Überprüfung usw., aber Sie bekommen die Idee. In Ihrem Controller:

public BreakfastFooBarController extends SimpleFormController { 
    @Override 
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) { 
     binder.registerCustomEditor(Breakfast.class, new BreakfastPropertyEditor(yourDao)); 
    } 
} 

Dinge zu achten:

  • Property ist nicht sicher
  • einfädeln, wenn Sie Feder Bohnen benötigen, entweder manuell zu injizieren oder sie im Frühjahr als Prototyp Rahmen definieren und Verwenden Sie die Methodeninjektion in Ihren Controller
  • throw IllegalArgumentException Wenn der eingehende Parameter nicht gültig ist/nicht gefunden wird, wird spring dies korrekt in einen Bindungsfehler umwandeln

hoffe das hilft.

Edit (als Antwort auf den Kommentar): Es in dem gegebenen Beispiel ein wenig seltsam aussieht, weil BreakfastSelectCommand wie eine Einheit sieht nicht, ich bin nicht sicher, was das tatsächliche Szenario, das Sie haben, ist. Angenommen, es handelt sich um eine Entität, zum Beispiel wie Person mit einer breakfast Eigenschaft dann würde die Methode formBackingObject() das Objekt Person aus dem PersonDao laden und es als Befehl zurückgeben. Die Bindungsphase würde dann die Frühstückseigenschaft abhängig von dem ausgewählten Wert ändern, so dass der Befehl, der in onSubmit ankommt, die Frühstückseigenschaft vollständig eingerichtet hat.

Abhängig von der Implementierung Ihrer DAO-Objekte, rufen sie zweimal auf oder versuchen, dieselbe Entity zweimal zu laden, bedeutet nicht, dass Sie zwei SQL-Anweisungen ausführen. Dies gilt insbesondere für Hibernate, wo es garantiert, dass es das gleiche Objekt zurückgibt, das in seiner Sitzung für eine gegebene Kennung ist, so dass der Binding-Versuch, die Breakfast Auswahl zu laden, selbst nicht verändert wurde, sollte nicht zu irgendwelchen führen unangemessener Aufwand.

+0

Dank gid. Zum Zeitpunkt der Bindung, wurde mein Befehlsobjekt nicht bereits (ein zweites Mal) erstellt? Es scheint seltsam, dass ich eine weitere Anfrage von Ihrem Dao brauchen sollte. – morgancodes

+0

@morgancodes siehe oben Bearbeiten ...benötigt ein bisschen mehr Platz –

+2

all das und nicht eine einzige Upvote ... –