拥有一个包含所有内容的Rest库json和一个不包含字段的json

时间:2018-11-26 23:58:04

标签: spring rest spring-boot

我有两个实体:Book和Category以及两者的存储库。在控制器中,我已经正确设置了方法,如下所示:

Contactable

这显然显示了所有@JsonIgnore所没有的书和实体中的每个字段。问题是,我需要具备:

  • 一页的书数据(书名,作者名,isbn ..)不带类别
  • 一页包含类别数据(类别名称)但没有书籍
  • 一个包含所有内容的页面(书籍数据以及它们所属的类别)

如何做到这一点? 我在某种情况下需要以某种方式忽略@jsonignore。我是否应该建立一个扩展的新实体,例如“问题”,并为此建立一个存储库?当然,这不是正确的方法。

2 个答案:

答案 0 :(得分:1)

使用DTOs data transfer objects

您可以创建多个DTOs以在您的API的响应中使用它们

DTOpojo class,用于自定义entity的返回数据

 public class BookWithoutCategoryDTO {
   private String name;
   private String authorName;
   .....
   /// and make setters and getters for them


 }

 public class BookWithCategoryDTO {
   private String name;
   private String authorName;
   private String category;
   .....
   /// and make setters and getters for them


 }

并创建自定义映射器,以将Book转换为BookDTO

答案 1 :(得分:1)

正如khalid Ahmed说的那样,您可以使用costum dtos,也可以添加“过滤器”以忽略Jackson中的特定字段。首先,我们需要在java对象上定义过滤器:

@JsonFilter("myFilterBook")
public class Book{
    ...
}

@JsonFilter("myFilterCategory")
public class Category{
    ...
}

在返回ResponseBody之前,请尝试使用ObjectMapper(Jackson):

如果一页包含书籍数据(书籍名称,作者名称,isbn ..)而没有类别:

ObjectMapper mapper = new ObjectMapper();
        SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter
        .serializeAllExcept("category");
        FilterProvider filters = new SimpleFilterProvider()
        .addFilter("myFilterBook", theFilter);
    String dtoAsString = mapper.writer(filters).writeValueAsString(book);

对于其他示例,您可以通过放入要忽略的内容来进行相同的思考。

有关与杰克逊编组期间忽略字段的更多详细信息,可以检查here