Java 重写Spring数据Rest请求映射

Java 重写Spring数据Rest请求映射,java,rest,spring-mvc,spring-data-rest,Java,Rest,Spring Mvc,Spring Data Rest,我们目前有一个RESTful web服务。我们正在更新服务,以纳入超媒体支持。我们在后端使用Spring数据Rest来处理HATEOAS属性的设置。我们面临的问题是,在迁移完成之前,我们仍然需要支持遗留API使用者,这意味着我们仍然需要支持没有HAL属性(如“\u links”和“\u embedded”)的响应 由于不太值得解释的原因,我们无法通过URL版本控制来解决这个问题。相反,我们需要能够将带有“application/json”接受头的请求映射到我们的旧控制器,并让SDR处理带有“ap

我们目前有一个RESTful web服务。我们正在更新服务,以纳入超媒体支持。我们在后端使用Spring数据Rest来处理HATEOAS属性的设置。我们面临的问题是,在迁移完成之前,我们仍然需要支持遗留API使用者,这意味着我们仍然需要支持没有HAL属性(如“\u links”和“\u embedded”)的响应

由于不太值得解释的原因,我们无法通过URL版本控制来解决这个问题。相反,我们需要能够将带有“application/json”接受头的请求映射到我们的旧控制器,并让SDR处理带有“application/hal+json”的任何请求。本质上,我们希望使用SDR作为回退来处理专门请求HAL格式响应的API请求

我在网上看到了这段摘录:

我们注册了一个只响应 RepositoryRestController,并且仅当路径要由 Spring数据REST。以便保留要处理的路径 与Spring Data REST处理的应用程序不同, 此自定义HandlerMapping检查URL路径并检查 已以该名称导出存储库。如果有,它允许 由Spring数据REST处理的请求。如果没有 以该名称导出的存储库返回null,这意味着 “让其他HandlerMapping实例尝试为该请求提供服务”

Spring数据REST HandlerMapping配置为 order=(Ordered.lower_priority-100),这意味着它通常是 当需要映射URL路径和现有URL路径时,排在第一位 应用程序将永远不会有机会服务一个意味深长的请求 用于存储库。例如,如果您在下导出了存储库 名称“person”,然后所有对应用程序的请求都会启动 使用“/person”将由Spring数据REST和您的 应用程序将永远不会看到该请求。如果您的存储库是 然而,以不同的名称出口(如“人”),然后 对“/people”的请求将转到Spring数据REST,并请求 “/人”将由您的应用程序处理

这似乎意味着,假设HandlerMapping顺序可以进行不同的配置,那么我们试图实现的目标是可能的。但到目前为止,我还没能做到这一点:

  • 将SDR的HandlerMapping设置为Ordered.HIGHEST_优先级似乎没有效果
  • 将SDR的HandlerMapping order设置为Ordered.Lower_Priority似乎会完全禁用排序,我的自定义控制器会将请求字段化,但SDR不再响应任何请求。application/hal+json刚刚得到406状态

是否有任何方法可以正确配置HandlerMappings,以便我的自定义控制器优先处理任何未专门映射到我的控制器的请求,SDR字段?

这实际上是开箱即用的方式。如果将控制器映射到SD-REST的URI空间,则应首选控制器。你能举个简单的例子来说明这个失败吗?@OliverGierke,当然,如果有帮助的话,我可以提供一个简单的例子。然而,您所描述的开箱即用功能似乎与文档中所述的内容直接矛盾:“[Spring Data REST]通常在映射URL路径时排在第一位,而您现有的应用程序将永远不会有机会为存储库的请求提供服务。”