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

Schreibe einen Kommentar