我们目前有一个level 2 RESTful Web服务 . 我们正在更新服务以包含超媒体支持 . 我们在后端使用Spring Data Rest来处理HATEOAS属性的设置 . 我们遇到的问题是,我们仍然需要支持我们的遗留API使用者,直到完成迁移,这意味着我们仍然需要支持没有HAL属性的响应,如"_links"和"_embedded" .

由于不值得解释的原因,我们无法通过URL版本化解决此问题 . 我们需要能够将带有“application / json”的Accept标头的请求映射到我们的旧控制器,并让SDR使用“application / hal json”处理任何请求 . 实质上,我们希望使用SDR作为后备来处理专门请求HAL格式响应的API请求 .

我在SDR documentation中看到了这段摘录:

我们注册一个自定义的HandlerMapping实例,该实例仅响应RepositoryRestController,并且仅当一个路径意味着由Spring Data REST处理时 . 为了保持应用程序要处理的路径与Spring Data REST处理的路径不同,此自定义HandlerMapping检查URL路径并检查是否已在该名称下导出存储库 . 如果有,它允许Spring Data REST处理请求 . 如果没有在该名称下导出的存储库,则返回null,这意味着“让其他HandlerMapping实例尝试为此请求提供服务” . Spring Data REST HandlerMapping使用order =(Ordered.LOWEST_PRECEDENCE - 100)进行配置,这意味着当映射URL路径时,它通常会排在第一位,而现有应用程序永远不会有机会为请求提供服务 . 意为存储库 . 例如,如果您以名称“person”导出存储库,则所有以“/ person”开头的应用程序请求将由Spring Data REST处理,您的应用程序将永远不会看到该请求 . 但是,如果您的存储库以不同的名称导出(如“人员”),那么对“/ people”的请求将转到Spring Data REST,并且“/ person”的请求将由您的应用程序处理 .

这似乎意味着我们想要实现的目标是可能的,假设可以不同地配置HandlerMapping顺序 . 到目前为止,我还没能完成这项工作:

  • 将SDR的HandlerMapping设置为Ordered.HIGHEST_PRECEDENCE似乎没有任何效果 .

  • 将SDR的HandlerMapping顺序设置为Ordered.LOWEST_PRECEDENCE似乎完全禁用了排序,我的自定义控制器确实对请求进行了记录,但SDR不再响应任何请求 . application / hal json刚刚获得406状态 .

有没有办法正确配置HandlerMappings,以便我的自定义控制器获取优先级和SDR字段任何未专门映射到我的控制器的请求?