Es ist eine eher allgemeine Frage, aber ich werde ein vereinfachtes Beispiel geben. Angenommen, ich habe eine Web-CRUD-Anwendung, die einfache Entitäten in einer Datenbank verwaltet, nichts als klassisch: JSP-Ansicht, RequestMapping-annotierter Controller, transaktionale Service-Schicht und DAO.
Bei einem Update muss ich die vorherigen Werte meiner Felder kennen, weil eine Geschäftsregel einen Test verlangt, der die alten und neuen Werte beinhaltet.
Also suche ich nach bewährten Verfahren für diesen Anwendungsfall.
Ich denke, der Spring-Code ist viel umfangreicher getestet und robuster als meiner, und ich würde es gerne so weit wie möglich auf die Spring-Art machen.
Hier ist, was ich versucht habe:
1/ Laden Sie ein leeres Objekt im Controller und verwalten Sie das Update im Service:
Data.java:
Klasse Data {
int id; // Primärschlüssel
String name;
// ... andere Felder, Getter und Setter aus Platzgründen ausgelassen
}
DataController
...
@RequestMapping("/data/edit/{id}", method=RequestMethod.GET)
public String edit(@PathVariable("id") int id, Model model) {
model.setAttribute("data", service.getData(id);
return "/data/edit";
}
@RequestMapping("/data/edit/{id}", method=RequestMethod.POST)
public String update(@PathVariable("id") int id, @ModelAttribute Data data, BindingResult result) {
// Binding-Result-Tests ausgelassen ..
service.update(id, data)
return "redirect:/data/show";
}
DataService
@Transactional
public void update(int id, Data form) {
Data data = dataDao.find(id);
// Ok, ich habe die alten Werte in data und die neuen Werte in form -> teste Sachen ...
// und manuell Felder von form nach data kopieren
data.setName(form.getName);
...
}
Es funktioniert gut, aber im echten Fall, wenn ich viele Domänenobjekte und viele Felder in jedem habe, ist es ziemlich einfach, eins zu vergessen ... wenn Spring WebDataBinder
es im Controller einschließlich Validierung erledigt hat, ohne dass ich etwas anderes als @ModelAttribute
schreiben muss!
2/ Ich habe versucht, die Daten aus der Datenbank vorab zu laden, indem ich einen Konverter deklariere
DataConverter
public class DataConverter {
Data convert(String strid) {
return dataService.getId(Integer.valueOf(strid));
}
}
Absolut magisch! Das data
ist vollständig aus der Datenbank initialisiert und die in Form vorhandenen Felder werden ordnungsgemäß aktualisiert. Aber ... keine Möglichkeit, auf die vorherigen Werte zuzugreifen ...
Also ist meine Frage: Wie könnte der Weg sein, die Spring DataBinder-Magie und den Zugriff auf die vorherigen Werte meiner Domänenobjekte zu haben?