Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC控制器继承和路由_Java_Spring_Spring Mvc_Spring Annotations - Fatal编程技术网

Java Spring MVC控制器继承和路由

Java Spring MVC控制器继承和路由,java,spring,spring-mvc,spring-annotations,Java,Spring,Spring Mvc,Spring Annotations,在我的SpringMVCwebapp中,我有一个用于CRUD操作的通用RESTful控制器。每个具体的控制器只需声明一个@RequestMapping,例如/foo。通用控制器处理了对/foo和/foo/{id}的所有请求 但是现在我需要编写一个更复杂的CRUD控制器,它将获得额外的请求参数或路径变量,例如/foo/{date}和/foo/{id}/{date}。因此,我扩展了我的通用CRUD控制器并编写了重载的fetch(id,date)方法,该方法将处理{id}和{date}。这不是问题 但

在我的SpringMVCwebapp中,我有一个用于CRUD操作的通用RESTful控制器。每个具体的控制器只需声明一个
@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) { .. }
} 
//我的通用CRUD控制器
公共抽象类AbstractCRUDControllerBean实现AbstractCRUDController{
@RequestMapping(method=RequestMethod.GET)
public@ResponseBody ResponseEntity fetchAll(){…}
@RequestMapping(value=“/{id}”,method=RequestMethod.GET)
public@ResponseBody ResponseEntity获取(@PathVariable(“id”)PK id){…}
@RequestMapping(method=RequestMethod.POST)
public@ResponseBody ResponseEntity添加(@RequestBody E entity){…}
@RequestMapping(value=“/{id}”,method=RequestMethod.PUT)
public@ResponseBody ResponseEntity更新(@PathVariable(“id”)PK id,@RequestBody E entity){…}
@RequestMapping(value=“/{id}”,method=RequestMethod.DELETE)
public@ResponseBody ResponseEntity remove(@PathVariable(“id”)PK id){..}
} 

//具体控制器,使用Foo实体
@控制器
@请求映射(“/foo”)
公共类FooControllerImpl扩展
AbstractCRUDControllerBean实现FooController{
//正在重写父对象的方法
@RequestMapping(value=“/null”,method=RequestMethod.GET)
public@ResponseBody ResponseEntity获取(@PathVariable(“id”)PK id){
返回null;
}
//新的fetch实现
@RequestMapping(value=“/{id}/{date}”,method=RequestMethod.GET)
public@ResponseBody ResponseEntity获取(@PathVariable(“id”)PK id,@PathVariable(“date”)date date){..}
}

您是否试图使用spring实现资源、子资源类型的jersey?这可能不是直接可能的。与其将通用RESTful服务声明为控制器,为什么不将其委托给它们呢

//My generic CRUD Operations
public abstract class AbstractCRUDControllerBean<E, PK extends Serializable> implements AbstractCRUDController<E, PK> {

  public ResponseEntity<E[]> fetchAll() { ... }

  public ResponseEntity<E> fetch(@PathVariable("id") PK id) { ... }

  public ResponseEntity<E> add(@RequestBody E entity) { ... }

  public ResponseEntity<E> update(@PathVariable("id") PK id, @RequestBody E entity) { ... }

  public ResponseEntity<E> remove(@PathVariable("id") PK id) { .. }
} 
//我的通用CRUD操作
公共抽象类AbstractCRUDControllerBean实现AbstractCRUDController{
公共响应fetchAll(){…}
公共响应属性获取(@PathVariable(“id”)PK id){…}
公共响应属性添加(@RequestBody E entity){…}
公共响应属性更新(@PathVariable(“id”)PK id,@RequestBody E entity){…}
公共响应删除(@PathVariable(“id”)PK id){..}
} 
和控制器中的委托

//Concrete controller, working with Foo entities
@Controller
@RequestMapping("/foo")
public class FooControllerImpl extends
        AbstractCRUDControllerBean<Foo, Long> implements FooController { 

  //we are interested in using fetchall but not others
  @RequestMapping(method=RequestMethod.GET)
  public @ResponseBody ResponseEntity<Foo> fetch(@PathVariable("id") PK id) { 
    return fetchAll();
  }

  //fetch with id and date
  @RequestMapping(value="/{id}/{date}", method=RequestMethod.GET)
  public @ResponseBody ResponseEntity<Foo> fetch(@PathVariable("id") PK id, @PathVariable("date") Date date) { .... }

}
//具体控制器,使用Foo实体
@控制器
@请求映射(“/foo”)
公共类FooControllerImpl扩展
AbstractCRUDControllerBean实现FooController{
//我们对使用fetchall感兴趣,但对其他的不感兴趣
@RequestMapping(method=RequestMethod.GET)
public@ResponseBody ResponseEntity获取(@PathVariable(“id”)PK id){
返回fetchAll();
}
//使用id和日期获取
@RequestMapping(value=“/{id}/{date}”,method=RequestMethod.GET)
public@ResponseBody ResponseEntity获取(@PathVariable(“id”)PK id,@PathVariable(“date”)date date){..}
}
此外,还可以根据参数的可用性映射方法

@RequestMapping(value="/{id}/{date}", params={"param1","param2","!param3"})
public @ResponseBody ResponseEntity<E> customFetch(@PathVariable("id") PK id, 
            @PathVariable("date") Date date, @RequestParam("param1") String param1,                
            @RequestParam("param2") String param2) {...}
@RequestMapping(value=“/{id}/{date}”,params={“param1”,“param2”,“!param3”})
public@ResponseBody ResponseEntity customFetch(@PathVariable(“id”)主键id,
@PathVariable(“日期”)date date,@RequestParam(“param1”)字符串param1,
@RequestParam(“param2”)字符串param2{…}

当param1和param2存在而param3不存在时,此方法映射/foo/id/date。

感谢您的建议。它非常适合我的需要。有时当你陷入困境时,你所需要的一切就是改变一种观点)
@RequestMapping(value="/{id}/{date}", params={"param1","param2","!param3"})
public @ResponseBody ResponseEntity<E> customFetch(@PathVariable("id") PK id, 
            @PathVariable("date") Date date, @RequestParam("param1") String param1,                
            @RequestParam("param2") String param2) {...}