2010-12-29 7 views
0

Ich arbeite an der Konvertierung eines Legacy-Projekts in Spring (versuchen, so wenig wie möglich für jetzt anzupassen) und ich bin auf ein kleines Problem mit dem Mapping/Übersetzen Legacy-Parameter zu a Modellattributobjekt. Ich mag mich völlig irren, wenn ich über dieses Problem nachdenke, aber mir scheint, dass die Umsetzung eines Parameters in ein spezifisches Modellattribut Setter den Request-Parameter über eine Methode zum Erstellen eines Modellattributs übergibt und manuell den richtigen Setter aufruft:Spring @ModelAttribute und Übersetzungsanforderung Parameter Bindungsnamen

@ModelAttribute("form") 
public MyForm createMyForm(@RequestParameter("legacy-param") legacy) { 
    MyForm myForm = new MyForm(); 
    myForm.setNewParam(legacy); 
    return myForm; 
} 

Ich möchte nicht unbedingt den Namen des Anfrageparameters ändern, da einige Javascript und JSPs davon abhängig sind, dass sie so benannt werden, aber gibt es irgendeine Möglichkeit, so etwas zu tun? Oder gibt es eine andere Möglichkeit, Anforderungsparameter zu Modellattributen zuzuordnen/zu übersetzen?

public class MyForm { 
    @ParameterName("legacy-param") 
    private String newParam; 

    public void setNewParam(String value) { ... } 

    public String getNewParam() { ... } 
} 

@Controller 
public class MyController { 

    @RequestMapping("https://stackoverflow.com/a/url") 
    public String myMethod(@ModelAttribute("form") MyForm myForm, BindingResult result) { ... } 
} 
+0

wo kommt @ParameterName kommt @ModelAttribute in Ihren JSPs verwenden? – OrangeDog

Antwort

2

Die Art und Weise, dass Modellattribut Methode geschrieben haben, in der Tat ungerade ist. Ich bin mir nicht ganz klar, was Sie eigentlich versuchen. Wenn Sie davon ausgehen, dass es viele Parameter gibt, werden Sie eine Menge MyForm-Instanzen in Ihrer ModelMap finden. Eine ‚normale‘ Art und Weise Modell-Attribut erstellen würde so aussehen:

@ModelAttribute("legacyParamNotCamel") 
public MyForm createMyForm(@RequestParameter("legacy-param-not-camel") String legacy) { 
    return legacy; 
} 

Dann in der JSP Sie es direkt in Ausdruck Sprache beziehen kann. z.B.

<c:out value="${legacyParamNotCamel}"/>

Wenn Sie sie auf ein Formular Träger Objekt setzen möchten, müssen Sie das alles in einem einzigen Verfahren tun, die das Objekt erstellt, nicht neue Kopien davon in jedem Verfahren machen. (Ihre Form angenommen hat mehr als einen einzigen Parameter, der mit ihm verbunden ist.)

- Es scheint so, was Sie versuchen wirklich, obwohl zu tun ist, die Parameternamen in der Anforderung übersetzen vor die Webdaten Bindemittel wird Ahold davon, damit Sie seltsam benannte Parameter an eine Java-Bohne binden können? Dazu müssen Sie einen Interceptor verwenden, der die Namen übersetzt, bevor der Bindungsprozess beginnt, oder Sie können eine eigene Unterklasse des Datenbinders erstellen, die eine Namensumwandlungszuordnung für Eigenschaften übernehmen kann.

+0

Zu Ihrem letzten Punkt, das ist richtig-- Ich versuche, die Parameternamen zu übersetzen. Tut mir leid, wenn das verwirrend ist, es war die einfachste Methode, die ich entwickeln konnte, die nicht viel Code änderte ... – rcl

Verwandte Themen