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=/api
和spring.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配置吧?使用RepositoryRestDispatcherSerlvet
或RepositoryRestExporterServlet
。如果您已经在使用 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 基本路径的主要内容,如果未能解决你的问题,请参考以下文章
HAL浏览器无法在spring-data-rest中正确自动配置
在 Spring Boot 应用程序中使用 API 网关时,HATEOAS 路径无效