카테고리 없음

Spring Boot API 응답은 반복되는 중첩 JSON을 반환합니다.

기록만이살길 2021. 2. 24. 22:43
반응형

Spring Boot API 응답은 반복되는 중첩 JSON을 반환합니다.

1. 질문(문제점):

나는이 User모델과 TodoItem모델 TodoItem모델이에 기본 키가 UserA를 모델 user_id@JoinColumn을. 내 문제는 getUsers항목을 추가 한 후 API 에서받는 응답 입니다. 반복해서 반복되는 매우 긴 중첩 JSON을 생성합니다. 기본 키 케이스를 제대로 처리하지 않는 것 같습니다.

TodoController.java

@RestController
@RequestMapping("/api")
public class TodoController {

@Autowired
private TodoRepository todoRepository;

@PostMapping("/addItem")
public TodoItem addTodoItem(@RequestBody TodoItem todoItem) {
    return todoRepository.save(todoItem);
}

User.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 인 사용자가있을 때 이름, 패스 및 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 호출에 시간이 걸릴 수 있습니다.

2. 해결방안:

TodoItem.java에서 User 속성에 대한 getter를 제거합니다.

TodoItem.java에 사용자 속성에 대한 setter 만 있는지 확인하십시오.

65817073
반응형