我检出了这个SO Post,其中讨论了如何在界面中使用RequestMapping
。尽管该帖子包含实现此目标的方法,但并未提及这样做的利弊。
明智的架构设计,将控制器用作接口是一个坏主意吗? 就控制器的多态性而言,我们将获得什么好处?
答案 0 :(得分:5)
将@RequestMapping
放在界面上没有任何问题。但是,请确保您有正确的理由这样做。多态可能不是一个好理由,您将不会在运行时或类似的情况下交换其他具体实现。
例如,Swagger代码生成器生成带有@RequestMapping
的接口以及方法,字段和返回类型(以及@Api
定义等)上的所有注释。然后,您的控制器将实现此接口。在这种情况下,这很有意义,因为它只是在强制您遵守Yaml中最初定义的Swagger / OpenAPI接口定义。有一个很好的副作用,它可以使您的控制器更加整洁。 (客户端也可以使用相同的Yaml为自己的语言框架生成自己的客户端存根。)
如果选择执行此操作,请确保使用最新版本的Spring Framework,因为有些错误仅在最近才得到修复,而并非所有注解都得到了继承。 https://github.com/spring-projects/spring-framework/issues/15682
如果您使用的是较早的Spring版本,则可能需要在控制器中重复相同的注释。
因此,这样做的真正原因是强制执行接口协定,并将接口定义(以及与该接口有关的任何信息)与实际的具体实现分开。
答案 1 :(得分:4)
与此相反的是
我最近也面临着将jax-rs注释放在接口或实现上的相同决定。因此,由于所有内容始终都“依赖”某些上下文,因此我想给您提供一个参数,用于将RequestMapping
(或@Path等,如果不使用spring的话)放在接口上: