복붙노트

[SPRING] REST 컨트롤러에서 일대 다 관계가있는 엔티티의 재귀 적 JSON 뷰

SPRING

REST 컨트롤러에서 일대 다 관계가있는 엔티티의 재귀 적 JSON 뷰

Spring Boot와 JPA를 사용하여 REST 인터페이스를 구축하고 있습니다.

이제 데이터베이스에서 가져온 제품 목록에 대해 이상한 JSON이 반환되었습니다. 내가 가지고 있다고 가정 해 봅시다 :

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    @JoinColumn(name = "categoryId", nullable = false, updatable = false)
    private Category category;

    ...
}

@Entity
public class Category implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy = "category", cascade = CascadeType.DETACH)
    @OrderBy("name ASC")
    private List<Product> products = Collections.emptyList();

    ...
}

제품의 JPA 저장소는 다음과 같이 정의됩니다.

public interface ProductRepository extends JpaRepository<Product, Long> {
    List<Product> findAll();
}

내 컨트롤러에는 다음과 같은 기능이 있습니다.

@Autowired
private ProductRepository productRepo;

@RequestMapping("/all-products", method = RequestMethod.GET)
public Map<String,Object> home() {
    Map<String,Object> model = new HashMap<String,Object>();
    model.put("products", productRepo.findAll());
    return model;
}

내 미친 운전은 다음과 같이이 서비스를 호출하려고하는 경우입니다.

$ curl localhost:8080/all-products

테이블 제품과 카테고리 간의 관계로 인해 재귀 적 출력이 발생합니다 (예 :

{"products":[{"id":1,"name":"Product1","category":
{"id":1,"name":"Cat1","products":[{"id":6,"name":"Product6","category":
{"id":1,"name":"Cat1","products":[{"id":6,"name":"Product6","category":
{"id":1,...

내가 뭘 잘못하고 있죠?

해결법

  1. ==============================

    1.당신은 잘못된 것 (최소한 코드 레벨에서는 오히려 개념적입니다)을하지 않습니다. json serializer는 다음과 같이 진행됩니다 :

    당신은 잘못된 것 (최소한 코드 레벨에서는 오히려 개념적입니다)을하지 않습니다. json serializer는 다음과 같이 진행됩니다 :

    보기를 사용하거나 건너 뛰어도됩니다.

    그리고 부가 메모 - @RestController이고 "모든 제품"을 호출하는 경우 목록이 아닌 다른 것을 반환하는 것이 약간 이상합니다. 맵에서 응답을 래핑하는 것은 불필요합니다. 많은 rest 클라이언트는 list () 메소드를 호출 할 때 목록을 기대합니다.

  2. ==============================

    2.나는 조금 늦다는 것을 알고 있지만 누군가가 같은 문제에 직면 할 경우에 대비하여 여기에 추가한다. 비슷한 주제에 대해 토론 할 수있는 또 다른 관련 답변이 있습니다.

    나는 조금 늦다는 것을 알고 있지만 누군가가 같은 문제에 직면 할 경우에 대비하여 여기에 추가한다. 비슷한 주제에 대해 토론 할 수있는 또 다른 관련 답변이 있습니다.

    https://stackoverflow.com/a/3359884/6785908

    여기에 인용하다.

  3. ==============================

    3.@JsonIgnore를 추가하면 저에게 효과적이었습니다.

    @JsonIgnore를 추가하면 저에게 효과적이었습니다.

    @OneToMany(mappedBy = "policy")
    @JsonIgnore
    private List<Payment> payments;
    

    @ JeanValjean이 최고입니다.

  4. from https://stackoverflow.com/questions/31465440/recursive-json-view-of-an-entity-with-one-to-many-relationship-in-rest-controlle by cc-by-sa and MIT license