【问题标题】:Have one Rest repository json with everything and one with fields excluded拥有一个包含所有内容的 Rest 存储库 json 和一个排除字段的 json
【发布时间】:2019-04-28 16:09:28
【问题描述】:

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

@RequestMapping(value="/books", method = RequestMethod.GET)
@CrossOrigin
public @ResponseBody List<Book> bookListRest() {    
    return (List<Book>) bookRepository.findAll();
}     

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

  • 一页包含图书数据(书名、作者姓名、isbn..),不带类别
  • 包含类别数据(类别名称)的一页没有书籍
  • 一页包含所有内容(图书数据及其所属类别)

如何做到这一点? 在某些情况下,我不知何故需要以某种方式忽略@jsonignore。我是否应该创建一个新实体来扩展问题,并为此创建一个存储库?这肯定不是正确的方法。

【问题讨论】:

    标签: spring rest spring-boot


    【解决方案1】:

    DTOsdata transfer objects怎么样

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

    DTO 是一个 pojo 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

    【讨论】:

      【解决方案2】:

      正如 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);
      

      您可以通过将您想要忽略的内容放在另一个示例中来做同样的想法。

      有关在使用 jackson 编组期间忽略字段的更多详细信息,您可以查看here

      【讨论】:

      • 这实际上是我使用的解决方案。问题是,我的其他 api 端点没有工作,因为它们缺少过滤器(添加它们是一个 PITA)。所以我决定使用 JSONViews baeldung.com/jackson-json-view-annotation
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 2021-10-28
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2020-06-10
      相关资源
      最近更新 更多