私のSpringMVCWebアプリには、CRUD操作用の汎用RESTfulコントローラーがあります。@RequestMapping
そして、各具象コントローラーは、たとえば、のみを宣言する必要がありました/foo
。/foo
汎用コントローラーは、およびへのすべての要求を処理しまし/foo/{id}
た。
/foo/{date}
しかし、今度は、追加のリクエストパラメータまたはパス変数(例:および)を取得する、もう少し複雑なCRUDコントローラーを作成する必要があり/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) { .... }
}