gpt4 book ai didi

java - Spring Web MVC 中的嵌套 Controller

转载 作者:行者123 更新时间:2023-11-30 08:06:36 25 4
gpt4 key购买 nike

我正在编写一个服务于三种相关资源类型的网络 API 服务器:作者、群组和 channel 。每个 channel 必须完全属于一个作者或组,访问控制由请求用户与相关作者或组的关系决定,因此我计划创建如下 URL 结构:

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

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

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

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

最佳答案

您通常应该根据“单一职责原则”来组织类:一个类应该做“一件事”,无论那是什么。

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

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

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

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

如果作者和组之间的 channel 管理逻辑相同,那么我建议使用 abstract class ChannelController<O extends ChannelOwner>处理所有 /channel映射;如果不同,则制作ChannelController<O>一个接口(interface),只需声明映射。

请注意,如果您使用 Spring Security 来处理授权, @RequestMapping annotations are inherited when you override/implement an abstract method, but @PreAuthorize and similar are not ,因此必须将安全注释复制到最低级别的实现类。您应该始终使用 MockMvc 来确保您收到针对不允许访问的适当禁止响应。

关于java - Spring Web MVC 中的嵌套 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34278555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com