0

我正在玩 crnk 试图推断我在文档中找不到的位。我将在标准 crnk 示例中解释我的问题:https ://github.com/crnk-project/crnk-framework/tree/master/crnk-integration-examples/spring-boot-example 。

项目和任务之间存在一对多的关系(其他资源不相关)。如果我理解正确(该示例使用显然已弃用opposite的@JsonApiRelation 参数),则关系的所有者是 1Task.project1。我现在想列出按相关资源的某些属性过滤的资源。例如,这按预期工作(从响应中留下一些不重要的位):

GET http://127.0.0.1:8080/api/tasks?filter[project.id]=121

{
  "data" : [ {
    "id" : "1",
    "type" : "tasks",
    "links" : {
      "self" : "http://127.0.0.1:8080/api/tasks/1"
    },
    "attributes" : {
      "name" : "Create tasks",
      "description" : null
    },
    "relationships" : {
      "project" : {
        "data" : {
          "id" : "121",
          "type" : "projects"
        }
    }
  } ]
}

但无法进行相反方向的过滤:

GET http://127.0.0.1:8080/api/projects?filter[tasks.id]=1

{
  "data" : [ ]
}

这是在资源设置下预期的吗(见上面的链接)?如果是,必须做什么才能使过滤双向工作?

4

1 回答 1

0

目前这是存储库必须处理的事情,一种方法是使 getter/setter 成为双向的,因此 Task.setProject 会将自身添加到 Project.tasks。

恕我直言,我认为这是存储库应该处理的东西,而不是 crnk 引擎中的内置东西。从 REST 角度来看,资源的 POST/PATCH/DELETE 不应触及相关资源。这将推迟对存储库的责任以进行这些查找。但也许有一些内置支持内存处理的可能性。问题出现在内存存储库中。例如,在 JPA 案例中,SQL 负责处理它(它也可以提供为此提供解决方案的路径)。

于 2019-11-08T05:01:51.607 回答