【问题标题】:Nested controllers in Spring Web MVCSpring Web MVC 中的嵌套控制器
【发布时间】:2015-12-14 23:34:12
【问题描述】:

我正在编写一个 Web API 服务器,它提供三种相关类型的资源:作者、群组和频道。每个频道必须由一个作者或组拥有,访问控制取决于请求用户与相关作者或组的关系,因此我计划创建一个 URL 结构,如:

  1. GET /authors/{authorId} — 查看特定作者
  2. POST /authors/{authorId}/channels — 创建属于该作者的频道
  3. GET /authors/{authorId}/channels — 列出属于该作者的频道
  4. GET /authors/{authorId}/channels/{channelId} — 查看属于该作者的特定频道
  5. GET /groups/{groupId} — 查看特定组
  6. POST /groups/{groupId}/channels — 创建属于该组的频道
  7. GET /groups/{groupId}/channels — 列出属于该组的频道
  8. GET /groups/{groupId}/channels/{channelId} — 查看属于该组的特定频道

完成的服务器将有更多的路径来处理作者、群组和频道;这些是作为例子给出的。

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

注意我见过a similar question asked,但问题和答案都集中在内部类上。

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    你应该根据“单一职责原则”组织课程:一个课程应该做“一件事”,不管那是什么。

    在这种情况下,似乎有一个像 AuthorController 这样的类来处理作者或组的 HTTP 机制通常会很好。这种控制器的映射看起来像这样(为简单起见,使用 Groovy 并使用 DomainClassConverter):

    @RequestMapping('/authors')
    @RestController
    class AuthorController {
    
        @RequestMapping('/{id}')
        Author singleResource(@PathVariable Author id) {
            id
        }
    }
    

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

    如果作者和组之间的频道管理逻辑相同,那么我建议使用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 来确保您收到适当的禁止访问响应。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2016-07-20
      • 2012-05-10
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      • 2012-08-31
      相关资源
      最近更新 更多