java - Spring Boot API 响应返回重复的嵌套 JSON
问题描述
我有一个User
模型和一个TodoItem
模型,其中模型有一个带有@joincolumnTodoItem
的模型的主键。我的问题是添加项目后从 API 获得的响应。它创建了这个超长的嵌套 JSON,它会一遍又一遍地重复自己。我觉得我没有正确处理主键情况。User
user_id
getUsers
TodoController.java
@RestController
@RequestMapping("/api")
public class TodoController {
@Autowired
private TodoRepository todoRepository;
@PostMapping("/addItem")
public TodoItem addTodoItem(@RequestBody TodoItem todoItem) {
return todoRepository.save(todoItem);
}
用户.java
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "name")
private String name;
@Column(name = "password")
private String password;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
private List<TodoItem> todos;
public User() {
}
public User(String name, String password, List<TodoItem> todos) {
this.name = name;
this.password = password;
this.todos = todos;
}
// setter and getters
TodoItem.java
@Entity
@Table(name = "todo_item")
public class TodoItem {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "todo")
private String todo;
@Column(name = "completed")
private boolean completed;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
public TodoItem() {
}
public TodoItem(String todo, boolean completed) {
this.todo = todo;
this.completed = completed;
}
// setters and getters
添加项目请求
{
"todo": "blahblah",
"completed": false,
"user": {
"id": 6
}
}
添加项目响应
{
"id": 26,
"todo": "blahblah",
"completed": false,
"user": {
"id": 6,
"name": null,
"password": null,
"todos": null
}
}
所以我已经不喜欢给出响应的方式了,为什么当 id 为 6 的用户存在时,name、pass 和 todos 为 null,我也只是给它传递了一个 todoitem,所以为什么 todo 为 null。数据库正确填充,只是响应似乎错误。然后我认为它与我在这里遇到的主要问题有关;这是在我向用户添加项目之后:
获取用户响应
[
{
"id": 6,
"name": "joe",
"password": "pass",
"todos": [
{
"id": 26,
"todo": "blahblah",
"completed": false,
"user": {
"id": 6,
"name": "joe",
"password": "pass",
"todos": [
{
"id": 26,
"todo": "blahblah",
"completed": false,
"user": {
"id": 6,
"name": "joe",
"password": "pass",
"todos": [
{
"id": 26,
"todo": "blahblah",
"completed": false,
"user": {
"id": 6,
"name": "joe",
"password": "pass",
"todos": [
{
"id": 26,
"todo": "blahblah",
"completed": false,
"user": {
"id": 6,
"name": "joe",
"password": "pass",
"todos": [
{
"id": 26,
"todo": "blahblah",
它就这样持续了数千行。即使响应很疯狂,数据库也会正确更新,但由于此问题,API 调用可能需要一段时间
解决方案
在您的 TodoItem.java 中,删除 User 属性的 getter。
确保您的 TodoItem.java 中只有用户属性的设置器。
推荐阅读
- angular8 - 如何以角度 8 向模板显示嵌套对象?
- python - 如何根据列表中的后续字符串将字符串列表转换为两列数据框
- sql-server - 使用 pem 文件、用户名和密码连接到 SQL Server
- php - XML 文件在发送时存储在哪里?
- c++ - C++ 如何实现从类型到类型的编译时映射?
- ruby - Rspec:失败/错误:ActionCable.server.pubsub.redis_connection_for_subscriptions.smembers “在线”
- java - Spring 多个自动装配的单例实例
- javascript - 如何在每个数据上传到服务器时显示进度或加载栏,并在通过时显示成功消息
- ios - 尝试在 Swift iOS 中缩短 url 时,在范围内找不到“linkBuilder”错误
- assembly - 当全局变量名称长于一个制表符空间时,MIPS 缩进