2015-12-14 100 views
2

我正在编写一个Web API服务器,它提供三种相关类型的资源:作者,组和通道。每个通道必须正好一个作者或团体所拥有和访问控制是通过请求用户的作者或组问题关系决定的,所以我计划建立类似的URL结构:Spring Web MVC中的嵌套控制器

  1. GET /作家/ {AUTHORID} - 查看特定作者
  2. POST /作者/ {AUTHORID} /信道 - 建立属于该作者
  3. GET /作者/ {AUTHORID} /信道的信道 - 属于该作者列表通道
  4. GET/authors/{authorId}/channels/{channelId} - 查看属于该作者的特定频道
  5. GET /组/ {的groupId} - 查看特定组
  6. POST /组/ {的groupId} /信道 - 建立属于该组
  7. GET /组/ {的groupId} /信道的信道 - 属于列表通道该组
  8. GET /组/ {的groupId} /信道/ {的channelID} - 查看属于该组

特定信道完成的服务器将具有用于处理与作者,团体和信道有更多的路径;这些是作为例子给出的。

尝试在Spring Web MVC中使用三个控制器(即AuthorsController,GroupsController,ChannelsController)做到这一点是否合理?我将如何使用RequestMapping注释将它们连接在一起?有没有一种方法可以分解这些在Spring Web MVC中更有意义的责任,但仍然保持凝聚力?

N.B.我看过a similar question asked,但问题和答案都集中在内部类。

回答

3

你应该基于“单一职责原则”组织班级:班级应该做“一件事”,不管是什么。

在这种情况下,似乎有一个类如AuthorController来处理作者或组的HTTP机制通常会很好。这种控制器的映射会是这个样子(Groovy中的简单性和使用DomainClassConverter):

@RequestMapping('/authors') 
@RestController 
class AuthorController { 

    @RequestMapping('/{id}') 
    Author singleResource(@PathVariable Author id) { 
     id 
    } 
} 

现在你听起来这似乎是它在多个类的相同的行为的要求,像可能用于继承,但是您也有一个对象,可以由多种所有者拥有,这听起来像泛型的可能用法。

如果通道管理的逻辑在作者和组之间是相同的,那么我建议使用abstract class ChannelController<O extends ChannelOwner>来处理所有的/channel映射;如果不同,那么使ChannelController<O>为一个接口,并且只声明映射。

请注意,如果您使用Spring Security来处理授权,@RequestMapping annotations are inherited when you override/implement an abstract method, but @PreAuthorize and similar are not,所以安全注释必须复制到最底层的实现类。您应始终使用MockMvc来确保您收到禁止访问的适当禁止响应。