Spring MVC-controller erbschaft-und routing -
In meinem Spring MVC webapp habe ich eine generische RESTful-controller für CRUD-Operationen. Und jedem konkreten controller hatte zu erklären, nur ein @RequestMapping
zum Beispiel /foo
. Generic controller verarbeitet alle Anfragen an /foo
und /foo/{id}
.
Aber jetzt muss ich schreiben, ein bisschen komplexer CRUD-controller, der die zusätzliche request-params oder die path-Variablen.e.g /foo/{date}
und /foo/{id}/{date}
. Also ich erweitere meinen generische CRUD-controller und schreiben überlastet fetch(id, date)
Methode, die sich mit beiden {id}
und {date}
. Das ist nicht ein problem.
Aber ich muss auch 'deaktivieren' fetch(id)
Implementierung von Basisklasse abgeleitet (Ressource darf nicht vorhanden sein /foo/{id}
mehr, nur bei /foo/{id}/{date}
). Die einzige Idee, die mir kam, ist das überschreiben dieser Methode in meiner Beton-controller, um eine Karte zu auf ein fake-uri und zurück null
. Aber das sieht ziemlich hässlich dirty hack, weil wir stellen einige gefälschte resource uri, statt ihn zu deaktivieren. Vielleicht gibt es eine bessere Praxis?
Irgendwelche Ideen?
//My generic CRUD controller
public abstract class AbstractCRUDControllerBean<E, PK extends Serializable> implements AbstractCRUDController<E, PK> {
@RequestMapping(method=RequestMethod.GET)
public @ResponseBody ResponseEntity<E[]> fetchAll() { ... }
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public @ResponseBody ResponseEntity<E> fetch(@PathVariable("id") PK id) { ... }
@RequestMapping(method=RequestMethod.POST)
public @ResponseBody ResponseEntity<E> add(@RequestBody E entity) { ... }
@RequestMapping(value="/{id}", method=RequestMethod.PUT)
public @ResponseBody ResponseEntity<E> update(@PathVariable("id") PK id, @RequestBody E entity) { ... }
@RequestMapping(value="/{id}", method=RequestMethod.DELETE)
public @ResponseBody ResponseEntity<E> remove(@PathVariable("id") PK id) { .. }
}
.
//Concrete controller, working with Foo entities
@Controller
@RequestMapping("/foo")
public class FooControllerImpl extends
AbstractCRUDControllerBean<Foo, Long> implements FooController {
//ugly overriding parent's method
@RequestMapping(value="/null",method=RequestMethod.GET)
public @ResponseBody ResponseEntity<Foo> fetch(@PathVariable("id") PK id) {
return null;
}
//new fetch implementation
@RequestMapping(value="/{id}/{date}", method=RequestMethod.GET)
public @ResponseBody ResponseEntity<Foo> fetch(@PathVariable("id") PK id, @PathVariable("date") Date date) { .... }
}
InformationsquelleAutor der Frage Nofate | 2011-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie versuchen, zu erreichen, die Ressourcen, subresource Art von jersey mit spring? Das kann nicht direkt möglich. Statt der Deklaration der generischen Rest-Dienst als controller, warum nicht Sie delegieren es Ihnen?
und Stellvertreter in den controller.
zudem können Sie map-Methode basiert auf der Verfügbarkeit auch die Parameter,
Diese Methode Karten /foo/id/Datum wenn param1 und param2 existiert und param3 nicht vorhanden.
InformationsquelleAutor der Antwort kalyan