弹簧 MVC 控制器继承和路由
2022-09-03 14:09:02
在我的Spring MVC webapp中,我有一个用于CRUD操作的通用RESTful控制器。例如,每个具体控制器只需要声明一个。通用控制器处理了 对 和 的所有请求。@RequestMapping
/foo
/foo
/foo/{id}
但是现在我需要编写一个更复杂的CRUD控制器,它将获得额外的请求参数或路径变量,例如和。因此,我扩展了我的通用CRUD控制器并编写重载方法,该方法将同时处理和.这不是问题。/foo/{date}
/foo/{id}/{date}
fetch(id, date)
{id}
{date}
但是我还需要“禁用”从基类派生的实现(资源必须不再可用,只能在 )。我想出的唯一想法是在我的具体控制器中覆盖此方法,将其映射到假uri上并返回 。但这看起来像是相当丑陋的肮脏黑客,因为我们暴露了一些虚假的资源uri,而不是禁用它。也许有更好的做法?fetch(id)
/foo/{id}
/foo/{id}/{date}
null
有什么想法吗?
//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) { .... }
}