java - 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”。
问题:
- 我无法在我的 JPA 存储库中手动选择所需的字段,也不知道如何处理嵌套对象。
- 仅使用 findAll 并使用 @JsonIgnore 排除这些字段的简单想法是不可能的,因为我的第一个请求仍然需要这些字段。
- 在我的存储库中使用 @Query 注释仅获取所需字段时,我找不到为我的 JSON 获取嵌套字段的方法。
提前致谢。
我将 Spring Data JPA 2.2.1 与 Spring Boot Web 2.2.1 一起使用。
解决方案
如果您使用 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}
}
推荐阅读
- c# - 发送 HttpRequestMessage 集合内部服务器端
- python - 在python中编辑现有的word doc表
- javascript - HTML 表格,具有多级组/折叠 - 默认折叠
- c - 为什么要分两步进行位移?
- java - hazelcast error 节点加入失败原因:加入节点的3.12.7版本与集群3.9版本不兼容
- javascript - 按顺序执行具有不同参数的 Promise
- php - URL 设置问题
- r - 是否有 R 函数可以从 SpatialPolygonsDataFrame 重新缩放坐标?
- go - time.Unix(t, offset) 给出相同的时间?
- javascript - Promise.all 不等待那时