Наследование и маршрутизация контроллеров Spring MVC

В моем веб-приложении Spring MVC у меня есть общий контроллер RESTful для операций CRUD. И каждый конкретный контроллер должен был объявить только @RequestMapping , например / foo . Общий контроллер обработал все запросы к / foo и / foo / {id} .

Но теперь мне нужно написать немного более сложный контроллер CRUD, который будет получать дополнительные параметры запроса или переменные пути, например / foo / {date} и / foo / {id} / { date} . Поэтому я расширяю свой общий контроллер CRUD и пишу перегруженный метод fetch (id, date) , который будет иметь дело как с {id} , так и {date} . Это не проблема.

Но мне также нужно «отключить» реализацию fetch (id) , производную от базового класса (ресурс больше не должен быть доступен в / foo / {id} , только в / foo / {id} / {date} ). Единственная идея, которую я придумал, - переопределить этот метод в моем конкретном контроллере, сопоставить его с поддельным uri и вернуть null . Но это выглядит довольно уродливым грязным взломом, потому что мы раскрываем какой-то поддельный uri ресурса, вместо того, чтобы отключать его. Может быть, есть лучшая практика?

Есть идеи?

//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) { .... }

}
15
задан Carl Manaster 9 October 2013 в 23:21
поделиться