Skip to content

[BUG] Support @JsonBackReference and JsonManagedReference annotations #2644

@jorgerod

Description

@jorgerod

Hi

We are testing FastJson2 in a spring-boot based application and we have a DTO with the @JsonManagedReference and @JsonBackReference annotation and it is being supported and throws the following exception:

com.alibaba.fastjson2.JSONException: level too large : 2048

	at com.alibaba.fastjson2.JSONWriterUTF16.startObject(JSONWriterUTF16.java:122)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)
	at com.alibaba.fastjson2.writer.ObjectWriter2.write(ObjectWriter2.java:71)
	at com.alibaba.fastjson2.writer.OWG_1_2_Item.write(Unknown Source)
	at com.alibaba.fastjson2.writer.FieldWriterList.writeList(FieldWriterList.java:353)
	at com.alibaba.fastjson2.writer.FieldWriterListFunc.write(FieldWriterListFunc.java:76)

Test to reproduce:

public class JsonManagedReferenceTest {

  @Test
  public void testJsonBackReference() throws Exception {
    // given
    final JsonManagedReferenceDTO dto = new JsonManagedReferenceDTO();

    final Item item = new Item();
    item.setItemName("Item1");
    item.setUser(dto);

    dto.getItems().add(item);

    // when
    final ObjectMapper mapper = new ObjectMapper();
    final String jsonJackson = mapper.writeValueAsString(dto);

    final String jsonFastjson2 = JSON.toJSONString(dto);

    // then
    assertThat(jsonJackson).isEqualTo(jsonFastjson2);
  }

  static class JsonManagedReferenceDTO {
    String id;

    @JsonManagedReference
    private List<Item> items = new ArrayList<>();

    public String getId() {
      return this.id;
    }

    public void setId(final String id) {
      this.id = id;
    }

    public List<Item> getItems() {
      return this.items;
    }

    public void setItems(final List<Item> items) {
      this.items = items;
    }

    static class Item {

      private String itemName;

      @JsonBackReference
      private JsonManagedReferenceDTO user;

      public String getItemName() {
        return this.itemName;
      }

      public void setItemName(final String itemName) {
        this.itemName = itemName;
      }

      public JsonManagedReferenceDTO getUser() {
        return this.user;
      }

      public void setUser(final JsonManagedReferenceDTO user) {
        this.user = user;
      }
    }
  }
}

I have tried adding

 String jsonFastjson2 = JSON.toJSONString(dto, Feature.ReferenceDetection); and the result is not correct either:

Result FastJson2

{"items":[{"itemName":"Item1","user":{"$ref":"$"}}]}

Result Jackson

{"id":null,"items":[{"itemName":"Item1"}]}

Thank you very much

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixed

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions