Crnk JsonApiRelation,OneToMany和过滤实现

时间:2018-04-03 22:16:04

标签: java spring-boot jpa crnk

我在java项目中使用crnk(JSON-API),我对spring boot和jpa的使用有3个问题 - 没有在文档中找到确切的实现细节。

  1. 例如,我有2个实体和各自的表:

    @Entity
    @JsonApiResource(type = "employee")
    public class Employee {
        @Id
        @JsonApiId
        private int id;
    
        private String name;
    
        @ManyToOne
        @JoinColumn(name = "typeId")
        private EmployeeType employeeType; //stored in table as typeId
    }
    
    @Entity 
    @JsonApiResource(type = "type")
    public class EmployeeType {
        @Id
        @JsonApiId
        private int id;
    
        private String typeName;
    
        private int salary;
    }
    
  2. 如何引入JsonApiRelation以便能够调用“/ employee / 1”和“/ employee / 1 / type”网址?

    1. 例如,还有一个实体。

      @Entity
      @JsonApiResource(type = "project")
      public class Project {
          @Id
          @JsonApiId
          private int id;
      
          private String supervisorName;
      
          private String projectName;
      }
      
    2. 首先,我希望为每个员工提供项目列表,他是一名主管,按名称联合并将其列为Json中的属性。

      尝试使用@OneToMany和@JoinColumn注释实现它,但得到了StackOverflowException。怎么可以实现。第二,如何用Relation实现这个?比如“/ employee / 1 / projects”url。

      1. 我应该如何为findAll方法实现结果的自定义过滤?例如,我有一个所有员工的列表,但我想从响应中排除其中的一些。应该为此行为引入哪个类/方法?

1 个答案:

答案 0 :(得分:1)

  1. @JsonApiRelation注释不应该是必需的。 Crnk将检测@ManyToOne注释并相应地映射它。
  2. 在crnk-jpa的情况下,指定JPA中的所有关系就足够了。匹配JSON API关系。所以你的方法似乎很好。什么是StackoverflowException堆栈跟踪? (在示例旁边,crnk-jpa中还有许多示例实体)
  3. 我会使用装饰器。见http://www.crnk.io/documentation/#_request_filtering。 RepositoryDe​​coratorFactory允许在调用者和crnk-jpa(或任何其他类型的存储库)之间放置自定义存储库。在那里你可以做任何类型的修改执行(也许)调用“真正的”存储库。 =>将为此添加一个示例
  4. 随时也可以在crnk中打开门票,以获取任何文档/示例说明。