首页 > 解决方案 > Java Spring Data JPA 和 REST API:排除嵌套 JSON 对象的字段

问题描述

目前,我正在将 Spring Data JPA 2.2.1 与 Spring Boot Web 2.2.1 一起用于 REST API 服务。

对/categories的 getter 调用会返回以下 JSON,这实际上是所需的结果:

[
    {
        "category1": "A",
        "category2": "B",
        "subcategories": []
    },
    {
        "category1": "A",
        "category2": "B",
        "subcategories": [{
                "field1": "A",
                "field2": "B",
                "field3": "C",
                "field4": "D"
        }]
    },
.........
.........
]

实体:

@Entity
@Table(name = "category")
@Getter @Setter
public class Category {

    @JsonIgnore
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String category1;
    private String category2;
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<Subcategory> subcategories;
}
@Entity
@Table(name = "subcategory")
@Getter @Setter
public class Subcategory {

    @JsonIgnore
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @JsonIgnore
    private int parent;
    private String field1;
    private String field2;
    private String field3;
    private String field4;
}

控制器:

@RestController
public class MyController {

    private final DataService dataService;

    @Autowired
    public MyController(DataService dataService) {
        this.dataService = dataService;
    }

    @GetMapping("/categories")
    public List<Category> getAllCategories() {
        return dataService.getAllCategories();
    }

存储库

public interface MyRepository extends JpaRepository<Category, Long> {
    List<MyRepository> findAll();
}

数据服务

@Component
public class DataService {
    private MyRepository myRepository;

    @Autowired
    public DataService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public List<Category> getAllCategories() { return myRepository.findAll(); }

我现在想向我的 API 添加一个新调用/limitedCategories,它不会返回所有字段。例如,应排除父实体的“category2”和嵌套实体的“field4”。

问题:

提前致谢。

我将 Spring Data JPA 2.2.1 与 Spring Boot Web 2.2.1 一起使用。

标签: javaspring-bootspring-data-jpaspring-json

解决方案


如果您使用 Jackson API,我建议您使用 @JsonView 功能。

例如

class Person {
   // it will be add always
   Integer id;

   // it will be add only for PutFirstName case
   @JsonView(Views.PutFirstName.class)
   String firstName;

   // it will be add only for PutLastName case
   @JsonView(Views.PutLastName.class)
   String lastName;
} 

class Views {
   static class PutFirstName{}
   static class PutLastNastName{}
}

// Controller 
@JsonView(Views.PutFirstName.class)
@GetMapping
Person getFirstName(){
     // result : {id,firstName}
}

@JsonView(Views.PutLastName.class)
@GetMapping
Person getLastName(){
    // result : {id, lastName}
}

推荐阅读