编程语言
首页 > 编程语言> > java-Spring Data Rest:如何通过另一个对象的键进行搜索?

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

作者:互联网

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

但就我而言,我需要搜索匹配的作业,以便可以添加也是键的其他参数.

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

列出findByUser(用户);

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

再次,我特别在寻找纯REST解决方案,因为Spring Data Rest项目试图鼓励纯净.

解决方法:

您可以看一下Spring Data的Query注释.它使您无需自定义控制器即可执行自定义查询.

编辑:

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

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

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

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

How to design RESTful search/filtering?
RESTful URL design for search

编辑2:

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

REST设计得很简单. REST的主要优势之一是您不必做任何事情.您可以根据自己的需要调整规格.当然,这可能意味着您的API的RESTful程度较低,但是如果它给API的使用者带来不必要的开销,则应严格遵守规范,这是否值得这样做?

当然,您可以设计上述想法以完全满足REST规范.这将涉及创建单独的搜索实体,将其持久化到数据库中,然后通过调用诸如/ result之类的子资源或诸如此类的子资源来检索搜索结果.但是,问题是,是否值得.

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

标签:spring-data-rest,spring-data,spring,java
来源: https://codeday.me/bug/20191120/2046934.html