Spring Data Rest 基本路径

Posted

技术标签:

【中文标题】Spring Data Rest 基本路径【英文标题】:Spring Data Rest base path 【发布时间】:2014-03-28 07:07:39 【问题描述】:

我通过创建扩展 RepositoryRestMvcConfiguration 的 Java 配置类并将 @RestResource 添加到存储库,将 Spring Data Rest (2.0) 添加到现有 Spring MVC 应用程序。

是否可以更改 Rest API 的基本 URL?例如:

http://localhost:8080/rest/customers

而不是

http://localhost:8080/customers

我尝试使用 setBaseURI 覆盖 configureRepositoryRestConfiguration,但它似乎不适用于响应中的所有链接。

【问题讨论】:

【参考方案1】:

从Spring Boot 1.2 开始,您可以设置此属性:

spring.data.rest.baseUri=api

或者:

spring.data.rest.base-uri=api

(Spring Boot 使用relaxed binding 系统)

注意:我发现如果你用自定义配置扩展RepositoryRestMvcConfiguration,该属性不会生效。欲了解更多信息,请参阅:

https://github.com/spring-projects/spring-boot/issues/2392

一旦下一个版本的 Spring Boot 发布(1.2.1 之后),解决方案将改为扩展 RepositoryRestMvcBootConfiguration

【讨论】:

来自您引用的文档:docs.spring.io/spring-boot/docs/1.2.x/reference/html/… DATA RESET (RepositoryRestConfiguration) spring.data.rest.base-uri= # 导出器应根据其计算其链接的基本 URI @adam0404 - 两者都有效,见docs.spring.io/spring-boot/docs/1.2.x/reference/html/… 在 Spring Boot 1.2.3 中,baseUri 已被弃用。请改用 basePath(或基本路径)。 在我的例子中(Spring Boot 2.3.2),属性spring.data.rest.base-path 被忽略了。原来我的代码库中有一个RepositoryRestMvcConfiguration(在从 Spring 切换到 Spring Boot 之前)。删除该类后,该属性按预期工作。【参考方案2】:

您可以通过以下方式覆盖RepositoryRestMvcConfiguration 来配置它:

@Configuration
@Import(RepositoryRestMvcConfiguration.class)
public class RestDataConfig  extends RepositoryRestMvcConfiguration 

  @Override
  protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) 
    super.configureRepositoryRestConfiguration(config);
    try 
      config.setBaseUri(new URI("/data"));
     catch (URISyntaxException e) 
      e.printStackTrace();
    
  

【讨论】:

这只会更改链接的基本 uri。 @EthanAnderson 没错。在一个相当简单的应用程序的情况下,它(可以说)不够吗? 据我所知,这根本没有帮助,因为您最终会得到指向不存在的控制器端点的链接。该资源可以从 /resource 访问,但该资源的链接将显示为 /data/resource,并且您可能会在链接后收到 404。 经过进一步检查,逻辑似乎最近发生了变化。在我运行 SDR 2.0.2.RELEASE 的项目中,它只是更改了链接,但在 2.1.0.RELEASE 中,它似乎在实例化相关 bean 时传入了 baseUri()。 URI.create("/data") 有助于避免必须捕获已检查的异常(而不是抛出运行时)【参考方案3】:

我用的是spring boot 1.2.3.REALEASE 我尝试了spring.data.rest.baseUri=/apispring.data.rest.basePath=/api,但它不起作用。

尝试和谷歌搜索后:server.servlet-path=/api 为我工作。

【讨论】:

您的配置适用于我的 Spring Boot 1.5.4。但是,我在弹簧安全方面遇到了问题。所以我用这种方式解决了这个问题(使用 yml 语法):“spring:data:rest:base-path:api”【参考方案4】:

我通过添加第二个“AbstractAnnotationConfigDispatcherServletInitializer”解决了我的问题:

public class RestWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer 

    @Override
    protected Class<?>[] getRootConfigClasses() 
        return null;
    

    @Override
    protected Class<?>[] getServletConfigClasses() 
        return new Class<?>[]  RepositoryRestMvcConfiguration.class ;
    

    @Override
    protected String[] getServletMappings() 
        return new String[]  "/rest/*" ;
    

    @Override
    protected Filter[] getServletFilters() 
        return null;
    

    @Override
    protected String getServletName() 
        return "rest-exporter";
    

【讨论】:

你也可以通过web.xml配置吧?使用RepositoryRestDispatcherSerlvetRepositoryRestExporterServlet。如果您已经在使用 web.xml,是否还需要使用 Java 配置?【参考方案5】:

在 application.properties(Spring boot version 2.2.0.M2) 中添加以下行

spring.mvc.servlet.path=/rest

希望对你有帮助

【讨论】:

【参考方案6】:

看官方文档how to change rest base uri

但我不知道为什么 spring.data.rest.basePath=/api 属性对我不起作用,我必须编写第二个解决方案:

@Configuration
class CustomRestMvcConfiguration 

  @Bean
  public RepositoryRestConfigurer repositoryRestConfigurer() 

    return new RepositoryRestConfigurerAdapter() 

      @Override
      public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) 
        config.setBasePath("/api");
      
    ;
  

【讨论】:

你需要use spring.data.rest.base-path而不是spring.data.rest.basePath【参考方案7】:

查看官方文档

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

server.servlet-path=/ # Path of the main dispatcher servlet.
server.context-path=

您可以将其包含在配置文件中。

另见Add context path to Spring Boot application

【讨论】:

以上是关于Spring Data Rest 基本路径的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data Rest 中同一实体的多个存储库

HAL浏览器无法在spring-data-rest中正确自动配置

在 Spring Boot 应用程序中使用 API 网关时,HATEOAS 路径无效

如何使用 Spring Data Rest 公开 resourceId

Spring Data REST不完全指南

在 Spring Data 中为同一 QueryDSL 路径创建多个别名