【问题标题】:Spring boot: how to set a common path for multiple RestControllersSpring boot:如何为多个 RestControllers 设置公共路径
【发布时间】:2016-02-16 04:05:36
【问题描述】:

我正在使用 spring boot 编写一个 api,我想将我的所有资源映射到一个公共基本路径(在本例中为 /api)后面。但是,我不想注释每个 RestController 类来执行此操作(例如,通过使用 @RequestMapping 对其进行注释)。 我已经考虑过以下解决方案,但它们都有我不希望的缺点:

  • 创建一个基类(例如ApiRestController)并让所有其他RestController 继承这个。这样做的缺点是类级别的 @Requestmapping 没有在基类和实现类之间合并。
  • 注释所有 RestController 但这会导致代码重复
  • 更改 server.context-path 属性。这样做的缺点是所有端点都将使用此基本路径。甚至是执行器项目公开的端点。
  • 使用自定义 DispatcherServlet 和 ServletRegistrationBean。但这似乎与更改 server.context-path 的效果相同。

那么有谁知道如何做到这一点而没有我总结的解决方案的缺点。该项目将仅公开基于 REST 的后端,并且不会提供任何静态内容(不知道这是否会影响可能的解决方案)。 Restcontrollers 也分为多个包。

谢谢。

【问题讨论】:

  • 如果我理解正确的话,Spring 上有一个关于这个特性的问题:jira.spring.io/browse/SPR-16336
  • @Dherik 提到的问题已关闭,我找不到解决方案。您找到解决此问题的方法了吗?
  • 现在我不得不接受这个解决方法,它将这个特定路径作为一个属性放在 yml 中并使用 spEL - stackoverflow.com/a/35699678/5035525

标签: spring rest spring-boot


【解决方案1】:

为什么不把@RequestMapping("/api") 放在所有的RestControllers 上?

@RestController
@RequestMapping("/api")
public class UserApi {
    @RequestMapping("/user")
    public String user() {
        ...
    }
}

【讨论】:

  • 如果可能的话,我想避免这种代码重复(非常干燥;)),总是会忘记它
  • 如果你忘记了,你会收到一个错误,这就足够了。在葡萄牙语中,我们有一个词来形容它,“preciosismo”。
  • 这不是为所有控制器添加公共上下文路径,而是将每个控制器分别添加到每个控制器。
  • @MichałMargiel 我就是这么说的。
【解决方案2】:

您可以尝试创建包含@RestController@RequestMapping 的自定义注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@RestConntroller
@RequestMapping(value = "/api" )
@interface MyController {

}

【讨论】:

  • 我认为如果我将这个注释放在一个类和一个“@RequesMapping”上(因为例如该类中的所有资源都在路径 /api/user 下),这会产生同样的问题,两个“@RequestMapping”注释不会合并,还是我错了?
  • 如果你把一个注解放在一个类上,另一个放在方法上,它们应该被合并。
【解决方案3】:

查看我对类似问题的回答。 How to configure a default @RestController URI prefix for all controllers? 您可以创建自定义注释并基于它执行映射。

【讨论】:

    【解决方案4】:

    您可以尝试使用@path 注解将多个 URI 视为单个 URI。

    @Path("sampleresource/{Filepath:.*}")
    public interface SampleResource {
        @GET
        @Produces({ MediaType.TEXT_PLAIN })
        @Path("/hello")
        public Response sayHello();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 2022-01-02
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2016-04-28
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多