Recursive JSON view of an entity with one-to-many relationship in REST controller

前端 未结 3 785
失恋的感觉
失恋的感觉 2020-12-31 19:25

I\'m using SpringBoot and JPA to build a REST interface.

Now, I have a strange JSON returned for the list of products fetched from the database. Let\'s say that I h

相关标签:
3条回答
  • 2020-12-31 19:42

    You're not doing anything wrong (at least at the code level it's rather conceptual) - json serializer just goes like this:

    1. Product - serialize it, but wait - there is a category field, so serializer must serialize the category field
    2. Category - serialize it, but wait - there is a products field, so serializer must serialize each of the product in the list
    3. Product - because your collection contains the product & product contains category it goes in a endless loop untill a timeout.

    You must use a view or just skip it.

    1. Use @JsonView

    2. Use a view as a POJO Return new ProductView that has all fields of product and a reference (category) to new CategoryView (you can end at this point) that has collection of (products) new ProductViewWithoutReferences, and so on

    3. Use @JsonIgnore on a collection of products

    And as a side note - if it's a @RestController and you're invoking "all-products" then it's a bit unusual to return something else than a list. Wrapping the response in a map is redundant. Many rest clients expect a list when they invoke list() method.

    0 讨论(0)
  • 2020-12-31 19:46

    Adding @JsonIgnore worked for me

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

    @JeanValjean your are the best

    0 讨论(0)
  • 2020-12-31 19:57

    I know it's a bit late, but adding it here in case anybody faces the same problem. Here is another relevant answer I could find which discuss about similar topic

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

    quoting it here

    Jackson 1.6 has annotation-based support for handling such parent/child linkage, see http://wiki.fasterxml.com/JacksonFeatureBiDirReferences.

    You can of course already exclude serialization of parent link already using most JSON processing packages (jackson, gson and flex-json at least support it), but the real trick is in how to deserialize it back (re-create parent link), not just handle serialization side. Although sounds like for now just exclusion might work for you.

    EDIT (April 2012): Jackson 2.0 now supports true identity references, so you can solve it this way also.

    0 讨论(0)
提交回复
热议问题