在我的Spring MVC webapp中,我有一個用於CRUD操作的通用RESTful控制器。並且每個具體控制器必須僅聲明@RequestMapping
,例如/foo
。通用控制器處理對/foo
和/foo/{id}
的所有請求。Spring MVC控制器的繼承和路由
但是現在我需要編寫一個更復雜的CRUD控制器,它將獲得更多的請求參數或路徑變量,例如/foo/{date}
和/foo/{id}/{date}
。因此,我擴展了我的通用CRUD控制器並且寫入超載的fetch(id, date)
方法,該方法將同時處理{id}
和{date}
。這不是問題。
但我還需要從基類派生的(資源絕不能提供/foo/{id}
了,只在/foo/{id}/{date}
)「禁用」 fetch(id)
實現。我想出的唯一想法是在我的具體控制器中重寫此方法,將其映射到假的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) { .... }
}
感謝您的意見。它非常適合我的需求。有時當你被困住時,你需要的每一件事都是改變一個觀點) – Nofate
+1好答案,並且很好的解釋 – andyb