当前位置: 首页 > 知识库问答 >
问题:

查找嵌套资源的实践

胡俊贤
2023-03-14

假设我有一个REST资源,比如:

/Company/{companyId}/Department/{departmentId}/Employees/{employeeId}

和实体类,其中CompanyEntity具有列表 和DepartmentEntity具有列表 。所有ID都是唯一的。

现在有人打电话来了

获取/company/{companyId}/department/{departmentId}/employees/{employeeId}

在Spring Data JPA/Hibernate中找到具有{employeeId}的员工的好方法是什么?

>

  • 道:

    赞成:仅1个查询

    反:companyId和departmentId未使用。它们甚至可以是随机的。这更像是GET/employee/{id},但我希望保留与company和Department的嵌套资源。

    我还想访问company object以检查询问的人是否与员工在同一公司。

    对于(DepartmentEntity部门:company.getDepartments()){

     if(department.getId() == departmentId) {
       for(EmployeeEntity employee : department.getEmployees()) {
         if(employee.getId() == employeeId)
         return employee;
       }
     }
    

    }

    赞成:考虑companyId和departementId

  • 共有1个答案

    长孙智刚
    2023-03-14

    只是通读一下问题和评论,几点:

    >

  • 更广泛地接受JB Nizet的建议,我认为其想法是使用可用的最直接的查找,然后进行验证。验证可以保护数据免受未经授权的访问,还可以确保关系查询语义有效。即如果员工记录不在指定的部门,用户不会期望返回该员工记录;因此(在实现中,不一定在API中)提供一种简单的方法,为员工获取部门,为部门获取公司,这样您就可以执行这些验证了。或者,每个容器都可以有一个包含ID的散列集合,因此您可以轻松地确定给定的员工ID是否在department.Employees集合中,以及Company.Departments中的department是否也在其中。

    拥有这样的嵌套集合并不稀奇,而且通常很有帮助。关系endpoint是此API设计模式的一个名称。但是我同意Oliver Gierke的观点,您应该为用户提供一个直接到达已知实体的路径。将此因素纳入设计的不同方法:

    • 您可以保留嵌套资源,并添加规范的/departments/employees集合。在从嵌套资源返回的结果中,可以包含一个规范链接,如模式所示。因此,get/companies/123/departments/456/employees/789可以返回一个employee的表示形式,以及一个Canonic链接(在标题或正文中,取决于您的有线格式)到/employees/789,客户机可以使用该链接对employee记录进行后续访问。
    • 更进一步,您可以决定只支持一个嵌套级别。因此get/companies/{companyId}/departments返回到公司内各部门的超链接集合;其中每个超链接都指向规范URL,例如/departments/456。不需要进一步的嵌套级别,因为员工和您需要了解的有关部门的其他所有信息都可以通过规范资源获得。

  •  类似资料:
    • 我想像下面这样嵌套资源。 但我不能得到请求。团队中的params[“dashboard_id”]参数,因为它似乎已被参数值替换。我试图通过调用一个中间函数来传递问题,并将参数传递到某个地方,但我不知道在哪里…你有答案吗?谢谢,佛朗哥

    • 假设我有两种资源:手推车和物品。项目可以嵌套在购物车内,也可以不嵌套在购物车内: 在REST约定中,购物车中的同一项目和购物车中的同一项目是不同的资源吗?

    • 以公司的rest表示为例。在这个假设的例子中,每个公司拥有0个或更多的部门,每个部门拥有0个或更多的员工。 一个部门不能没有关联公司。 没有关联部门,员工就无法存在。 null 但是,如果我想列出()所有公司的所有员工,我的困难就来了。 其资源模式将最紧密地映射到(所有员工的集合) 这是否意味着我应该有,因为如果有的话,那么有两个URI可以获得相同的资源? 在基本级别上,返回与嵌套最深的模式完全相

    • 我需要实现一个在我看来更适合SOAP而不是RESTful服务的搜索,因此我正在努力将其表达为RESTendpoint。 公司(companyId) 合同(Contractd,companyId,privilegeGroupId) PrivilegeGroup(privilegeGroupId,privilegeId) 特权(privilegeId) 主键以粗体显示。 FindPrivilegesB

    • 问题内容: 我正在使用嵌套集(又名经过修改的预排序树遍历)来存储组列表,并且我试图找到一种快速方式来一次为所有组生成面包屑(作为字符串,而不是表)。我的数据也使用邻接表模型存储(有一些触发器可以使两者保持同步)。 因此,例如: 代表树: 节点A 节点B 节点C 节点D 节点E 节点F 我希望能够有一个返回表的用户定义函数: 为了使它稍微复杂一点(尽管这超出了问题的范围),我还需要遵守用户限制。因此

    • 当访问下面的URL时,我会得到相应的分页 但是,当访问以下URL时,Spring Data REST没有开箱即用的分页- UserRepository和UserPostRepository都是带有分页的JPA存储库。结果,第二个URL抛出GC开销超出错误,因为返回结果的行数非常大。 有没有办法用第二个URL进行分页?