Spring Data Rest:如何通过另一个对象的键进行搜索?

2024-02-13

在 Spring-Data-Rest 中,对象的 ID 是随对象返回的 URI。例如,如果我有一个用户,它可能有一个如下 URI:

http://example.com/users/1

在真实的 REST api 中,此 URI 是对象的 id,您不应该仅使用“1”作为 id。

那么,我如何搜索属于该用户的所有订单?

http://example.com/orders/search/findByUser?user={{XXX}}

具体来说,我用什么来{{XXX}}?

我知道我可以进行相反的搜索:

http://example.com/users/1/orders

但就我而言,我需要搜索匹配的职位,以便我可以添加其他参数,这些参数也是关键。

我可以导出/orders/search/findByUser通过在 OrderRepository 上创建此函数定义:

列表findByUser(User user);

and findByUser将由 Spring-Data-REST 导出,但是我如何指定User作为 GET 参数?

再次强调,我专门寻找纯粹的 REST 解决方案,因为 Spring Data Rest 项目试图鼓励纯粹性。


你可以看看Query http://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/Query.htmlSpring Data 的注释。它使您能够执行自定义查询,而无需自定义控制器。

Edit:

查询参数是通过简单属性过滤资源的好方法。由于 SDR 将所有复杂类型序列化为关系,因此更清楚的是,过滤仅适用于其余(简单)属性。 如果您只有一种关系,那么您正确地提到了进行“反向”搜索的方法,正如您所说的那样/users/1/orders.
如果您想通过多个关系进行搜索,我建议您定义一个单独的搜索(子)资源,并通过向该资源发出 POST 请求来执行搜索。
例如:

POST /orders/search
{
    "user": "http://example.org/users/1",
    ...
}

这样,SDR 就会正确地将 URI 转换为实体。但是,我认为您需要在此处使用自定义控制器,但仍然可以使用 Spring 数据存储库并提供用户和其他实体作为参数。

有关更多信息,请参阅以下 SO 问题:

如何设计 RESTful 搜索/过滤? https://stackoverflow.com/questions/5020704/how-to-design-restful-search-filtering/18933902#18933902
用于搜索的 RESTful URL 设计 https://stackoverflow.com/questions/207477/restful-url-design-for-search

Edit2:

解决使用 POST 进行搜索违反 REST 规范的问题:

REST 的设计很简单。 REST 的主要优点之一是您不会被迫做任何事情。您可以调整规范,直到它满足您的需求。当然,这可能意味着您的 API 不太 RESTful,但您应该考虑是否值得严格遵守规范,如果它会给 API 的使用者带来不必要的开销。

当然你可以按照上面的思路来设计,完全满足REST规范。这将涉及创建一个单独的搜索实体,将其保存到数据库,然后通过调用子资源来检索搜索结果,例如/result或类似的东西。然而,问题是,是否值得。

在您的具体示例中,我只要求客户端解析链接中的 ID 并将其作为查询参数提供。如果您稍后要扩展应用程序,则可以引入命名搜索等功能并应用上述解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data Rest:如何通过另一个对象的键进行搜索? 的相关文章

  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • Logback:SizeAndTimeBasedRollingPolicy 不遵守totalSizeCap

    我正在尝试以一种方式管理我的日志记录 一旦达到总累积大小限制或达到最大历史记录限制 我最旧的存档日志文件就会被删除 当使用SizeAndTimeBasedRollingPolicy在 Logback 1 1 7 中 滚动文件追加器将继续创建
  • 在 Struts 2 中传递 URL 参数而不使用查询字符串

    我想使用类似的 URL host ActionName 123 abc 而不是像这样传递查询字符串 host ActionName parm1 123 parm2 abc 我怎样才能在 Struts 2 中做到这一点 我按照下面的方法做了
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • Spring Batch:一个读取器、多个处理器和写入器

    在 Spring 批处理中 我需要将 ItemReader 读取的项目传递给两个不同的处理器和编写器 我想要实现的是 gt ItemProcessor 1 gt ItemWriter 1 ItemReader gt item gt Item
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 如何从 Spring Boot 中排除依赖项

    我正在使用 Spring Boot 以下是我的 gradle 文件 buildscript ext springBootVersion 2 0 0 BUILD SNAPSHOT repositories mavenCentral maven
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向
  • try-with-resources 中出现死代码警告,但翻译后的 try-catch-finally 中没有出现死代码警告

    以下代码使用try 有资源 https docs oracle com javase specs jls se7 html jls 14 html jls 14 20 3Java 8 中引入的构造 偶尔抛出 方法被声明为抛出一个偶尔的异常

随机推荐

  • netty中非阻塞通道中的SO_TIMEOUT

    如果通道在超时毫秒内未收到读取 响应 SO TIMEOUT 是否会使非阻塞通道过期 bootstrap group workerGroup channel NioSocketChannel class handler channelInit
  • JBoss 5.0.1 上的 servlet jar 文件在哪里?

    大家好 我正在尝试设置要在 JBossAS 5 0 1 上运行的构建文件 并且我需要找到应该用于构建的 servlet jar 文件 我看过的所有网页似乎都表明该文件是 javax servlet jar 并且它应该位于 C server
  • 尝试播放音频 (.wav) 文件时没有声音

    我有一个非常简单的类 可以使用以下代码播放声音文件 import java io File import java io IOException import javax sound sampled AudioSystem import j
  • Vuetify 数据表不显示数据

    Vuetify 数据表不显示数据 显示显示了 1 行中的 1 行 但表体为空 我的组件代码
  • 从子表单更改父表单属性的正确方法是什么?

    我只是想知道我是否以正确的方式这样做 我有两个表单 一个父表单和一个子表单 选项对话框 要从子表单更改父表单中的属性 我使用如下代码 Create an array of all rich textboxes on the parent f
  • 部署时捆绑器错误

    我目前正在使用guard 即guard coffeescript gem 在我的OSX 开发系统上编译我的javascript 将来我可能会添加更多的guard 任务 我添加了rb fseventgem 到我的 Gemspec 现在我看到在
  • 我应该在临时/生产环境中使用 PHPUnit 吗?

    我已经安装了 PHPUnit 框架来执行单元测试 我已经编写了测试用例 并且还使用了现有的 PHPUnit 库进行测试 是否需要在临时和生产环境中配置 PHPUnit 框架 如果是这样 phpunit 测试框架和相关文件会在暂存和生产中占用
  • Angular2 ng-bootstrap:使用不同的数据重用模态模板

    我正在构建一个类似仪表板的界面 其中包含一组包含可比数据的实体 这些实体中的每一个都有一个编辑按钮 我想用它来打开一个显示相应数据的模式 我想重用相同的模式模板 并显示来自单击编辑按钮的实体的数据 我在用Angular2 with ng 引
  • 检查 Java 中的内存布局

    我正在尝试继承 出于教育目的 我想检查为各种对象分配的地址以及对象内的字段 有没有一个工具可以让我查看 JVM 正在使用哪些内存以及它的用途 例如 如果我有两个课程 class A int i j int f class B extends
  • 在 cap 部署时预编译资产时收到“警告:已初始化常量”

    目前 我在通过 capistrano 进行生产部署时遇到了关于部署 资产 预编译的奇怪警告消息 当我第一次部署演示 Rails 项目时运行 cap 生产部署时 收到以下警告消息 并且部署失败 cap 中止
  • 如何通过创建React应用程序启用JIT(即时模式)?

    我尝试自己在 create react app 中设置 JIT 但它似乎不起作用 因为样式没有更新 我正在使用 craco 来构建带有 tailwind css 的应用程序 并且还添加了 TAILWIND mode WATCH 因为他们建议
  • 如何自动装配 Spring 环境对象

    我正在尝试从应用程序对象内的 properties 文件获取属性 我对如何做到这一点的唯一了解是通过Environment object 它在我的配置中运行得很好 Configuration ComponentScan basePackag
  • 使用基于 Spark 数据集的 ML API 时初始化逻辑回归系数?

    默认情况下 逻辑回归训练将系数初始化为全零 但是 我想自己初始化系数 这将很有用 例如 如果之前的训练运行在几次迭代后崩溃了 我可以简单地使用最后一组已知的系数重新开始训练 这对于任何基于数据集 数据帧的 API 最好是 Scala 是否可
  • div 真的可以覆盖布局上所有内容的 table 吗?

    也许已经有一个关于这个主题的问题 但我找不到它 我的问题很简单 我可以在页面布局上仅使用 div 吗 例如 我在创建一个带有角的 div 时遇到了麻烦 A B C D E F G H I 将所有字母作为带有一些背景的div 而字母E是放置内
  • Kubernetes:获取容器内的实际资源限制

    有没有办法获取容器内的实际资源 CPU 和内存 约束 假设节点有 4 个核心 但我的容器通过资源请求 限制仅配置了 1 个核心 因此它实际上使用 1 个核心 但它仍然从 proc cpuinfo 看到 4 个核心 我想根据应用程序实际可以使
  • 查询线程(不是进程)处理器关联性?

    在 Windows 上 您可以为进程调用 SetProcessAffinityMask 为线程调用 SetThreadAffinityMask 然而 Windows 似乎只公开 GetProcessAffinityMask 而不是针对进程的
  • 部署到 OS X 10.6 和“使用旧版运行时的平台不支持 -fobj-arc”

    背景 我正在为 OS X 构建一个应用程序 部署目标为 10 6 我还没有将我的应用程序完全转换为 ARC 但我添加了一些将从 ARC 中受益的新类 因此我设置了 fobj arc这些类的编译器标志 编译失败通用 32 64 位英特尔架构
  • 更改 scanf() 分隔符

    我的目标是改变分隔符scanf to n 我尝试使用scanf n s sen 并且对于单一输入工作得很好 但是当我将同一条线放入for循环多个句子它给了我垃圾值 有谁知道为什么 这是我的代码 char sen 20 for i 0 i l
  • 如何在laravel上使用dd()而不停止程序

    我正在用 laravel 构建一个网站 我想调试我的程序 但很难使用 dd 因为它会立即停止程序 我想让它每次执行时逐行显示 知道吗 任何帮助将不胜感激 谢谢 在不输出到页面的情况下获取结果的另一种方法 有时对生产很有用 是将其记录到文件中
  • Spring Data Rest:如何通过另一个对象的键进行搜索?

    在 Spring Data Rest 中 对象的 ID 是随对象返回的 URI 例如 如果我有一个用户 它可能有一个如下 URI http example com users 1 在真实的 REST api 中 此 URI 是对象的 id