【问题标题】:How to customize Spring Data REST to use a multi-segment path for a repository resource?如何自定义 Spring Data REST 以对存储库资源使用多段路径?
【发布时间】:2015-08-04 11:47:48
【问题描述】:

我正在使用 Spring Data JPA 和 Spring Data REST 开发一个基于组件的 CRUD 应用程序。我有几个组件。例如 system 组件具有User 模型和UserRepository。组件由包名称区分。喜欢com.example.app.<component_name>

所以为了让我的 REST API 看起来更干净,我需要实现 API URL,如下所示。

host:8080/<component_name>/<model_collection_name>

例如

host:8080/system/users

我在我的存储库中做了以下操作

@RepositoryRestResource(collectionResourceRel = "users", path = "system/users")
public interface UserRepository extends PagingAndSortingRepository<User, Long> {
   ...
}

当我转到http://localhost:8080时,这会生成以下内容

{
   "_links": {
   "users": {
   "href": "http://localhost:8080/system/users{?page,size,sort}",
    "templated": true
},
...

但是当我转到http://localhost:8080/system/users

报错

2015 年 5 月 22 日星期五 17:56:37 IST 出现意外错误(类型=Not 找到,状态=404)。没有可用的消息

注意:如果我将路径映射到system-users,那么它工作正常,但是当我在路径中使用/ 时,例如system/users,它中断并给出错误。

【问题讨论】:

    标签: java spring spring-mvc spring-boot spring-data-rest


    【解决方案1】:

    tl;博士

    不支持。

    详情

    一般来说:不要专注于设计网址。根据定义,URI 的结构与 REST 客户端无关:

    服务器或客户端软件在任何时候都不需要知道或理解 URI 的含义——它们只是充当资源创建者(人类命名机构)可以将表示与语义关联起来的管道由 URI 标识。

    (来自 Roy Fielding - 建筑风格和 基于网络的软件架构设计 - Section 6.2.4)

    如果您遵循该标准,您将负责选择关系名称、为您公开的资源设计表示等。

    也就是说,目前不支持您要查找的内容。如果您认为值得添加此功能(由于上面给出的论点,我认为不值得),请随时在我们的bug tracker 中开票。

    由于 Spring MVC 映射的工作方式,特别是奇异路径段和非奇异路径段的映射组合可能会导致一些歧义,因此实现起来可能相当棘手。所有这些都使得该请求不太可能得到跟进。

    【讨论】:

    • 您的论点似乎有效,但这并不能解决我的问题。我正在对开发大型多组件 ERP 类应用程序进行技术可行性研究。无论如何,感谢您为回答这个问题所付出的时间和精力。如果可能,请考虑在以后的版本中解决此问题,因为它可能会帮助像我这样的其他人。我在 Jira jira.spring.io/browse/DATAREST-555 中创建了一个问题
    • 那么 Spring Data Rest 是否不适合 API 版本控制?
    • @IllSc 您可以通过 application.properties 中的 spring.data.rest.base-path 属性修改基本路径来版本化您的 api。
    • @MiguelPereira 这不是一个好的解决方案,因为如果您更改基本路径,您的最后一个将不再起作用。使用 API 版本控制的原因是能够同时交付多个版本。
    • @FelipeDesiderati 我为每个新版本使用了一个新的 Spring Boot 应用程序。依赖于共享模块。所以所有 API 版本都可以正常工作:)。具有额外的好处,例如干净的代码、独立扩展和每个版本的开发。喜欢春天,但可能会在下一个项目中转向新的东西。缓慢的启动时间 = 公共云中的高运营成本。
    【解决方案2】:

    我认为这个(或类似的)问题已经在 stackoverflow 上回答了 here

    使用自定义 RepositoryRestMvcConfiguration 类设置基本 uri。

    【讨论】:

    • 感谢您的回答。但这不是我试图在这里更改的基本 URL。我可以通过在 spring-boot 中将 spring.data.rest.baseUri=api 添加到我的 application.properties 文件中简单地做到这一点。我需要在路径中有斜杠,我试图将其作为其余链接公开。
    • 或者有没有办法为我的每个组件的其余数据设置多个基本 uri。
    • 所以你的目标是提供两个 restful 端点(组件 A 和 B,如“系统”),每个端点可能有多个存储库(repA1、repA2、...,如“用户”)下面..? localhost:8080/A/repA1 localhost:8080/A/repA2 localhost:8080/B/repB1 组件本身是否包含任何逻辑,或者它只是构建应用程序的一种方式?
    • 刚刚发现另一个 stackoverflow 帖子。我认为这个和你的很相似,但没有提供解决方案:stackoverflow.com/questions/26808697/…
    • 再次感谢您所付出的努力。组件有自己的逻辑。我有system (the core framework)distributionfinanceHR 等组件。Spring 并没有让我达到我想要做的事情。似乎我必须转储弹簧数据休息并去做其他事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2017-09-19
    • 2018-07-30
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多