카테고리 없음

Get 컨트롤러는 Spring JPA에서 List <String>이 null로 JSON을 수신합니다.

기록만이살길 2021. 3. 3. 05:03
반응형

Get 컨트롤러는 Spring JPA에서 List 이 null로 JSON을 수신합니다.

1. 질문(문제점):

Postman을 통해 새 엔터티를 게시 할 때 모든 것이 잘 작동하며 이에 대한 답을 얻습니다.

{
    "id": 3,
    "ingredients": [
        "Eggs",
        "Oil"
    ]
}

하지만 데이터베이스에서 기존 엔터티를 가져 오려고하면 List <String> 성분이 "null"로 반환됩니다.

[
    {
        "id": 3,
        "ingredients": null
    }
]

내 모델은 다음과 같습니다.

package com.petie.weeklyrecipesschedule.model;

import javax.persistence.*;
import java.util.List;

@Entity
public class Recipe {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    @Embedded
    private List<String> ingredients;

    protected Recipe() {}

    public Recipe(String name, List<String> ingredients) {
        this.name = name;
        this.ingredients = ingredients;
    }

    //Getters and setters
    //toString()
} 

내 저장소

package com.petie.weeklyrecipesschedule.repository;

import com.petie.weeklyrecipesschedule.model.Recipe;
import org.springframework.data.jpa.repository.JpaRepository;

public interface RecipeRepository extends JpaRepository<Recipe, Long> {
}

그리고 내 컨트롤러

package com.petie.weeklyrecipesschedule.controller;

import com.petie.weeklyrecipesschedule.model.Recipe;
import com.petie.weeklyrecipesschedule.repository.RecipeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/recipes")
public class RecipeController {

    @Autowired
    private RecipeRepository recipeRepository;

    public RecipeController(RecipeRepository recipeRepository) {
        this.recipeRepository = recipeRepository;
    }

    @GetMapping("/all")
    List<Recipe> getAll() {
        return recipeRepository.findAll();
    }

    @PostMapping("/post")
    Recipe newRecipe(@RequestBody Recipe recipe) {
        return recipeRepository.save(recipe);
    }
}

종속성에 관한 한 저는 Spring Web, Spring Jpa 및 H2 데이터베이스를 사용하고 있습니다.

2. 해결방안:

다음을 사용할 수도 있습니다 @ElementCollection.

@ElementCollection
@CollectionTable(name = "recipe_ingredients", 
        joinColumns = @JoinColumn(name = "recipe_id"))
@Column(name = "ingredient_name")
private List<String> ingredients;

JPA 어노테이션 @Embedded은 유형을 다른 엔티티에 임베드하는 데 사용됩니다.

참고 : 또한 id게시 요청 을 보낼 필요가 없으며 자동으로 생성됩니다.

65760886
반응형