Jackson JsonMappingException: бесконечная рекурсия (StackOverflowError) - PullRequest
0 голосов
/ 24 декабря 2018

У меня проблема с преобразованием объекта в эквивалентный JSON.

Ниже приведена структура моего класса:

public class Record {
    private byte[] header;
    private String mti;
    private String bitmap;
    private int fieldNumber;
    private String data;
    private String name;
    private String recordType;
    private List<Record> subRecords;
    private Field recordSchema;
    private List<PDSRecord> pdsRecords;
}

В моем случае запись может иметь несколько вложенных записей, а затем каждая дополнительная запись может иметь несколько вложенных записей.Поэтому я придумала эту схему для хранения записей.

Проблема, с которой я сталкиваюсь, связана с циклической ссылкой List<Record> внутри Record класса.

Может ли Джексон каким-то образом преобразовать этот объект?Кроме того, мне понадобится полная информация обо всех вложенных записях.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Я смог решить это.Для этого мне нужно было сгенерировать уникальный идентификатор для каждого создаваемого объекта и пометить класс следующим образом:

@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")

Итак, полный класс выглядит так:

@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data // Lombok 
public class Record {
    private String id;
    private byte[] header;
    private String mti;
    private String bitmap;
    private int fieldNumber;
    private String data;
    private String name;
    private String recordType;
    @ToString.Exclude // Lombok
    private List<Record> subRecords;
    private Field recordSchema;
    private List<PDSRecord> pdsRecords;

    public Record()
    {
        this.id = UUID.randomUUID().toString();
    }
}

Надеждаэто помогает.

0 голосов
/ 24 декабря 2018

Вы можете попробовать приведенный ниже код.Я надеюсь, что это решит вашу проблему.

    try{
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        String value = mapper.writeValueAsString(r3);
        System.out.println(value);
    }catch(IOException a){
        a.printStackTrace();
    }

Вывод: { "header": "UEFOS0FK", "mti": "Data", "bitmap": "Name", "fieldNumber": 5, "data": "data", "name": "name", "recordType": "Data", "subRecords": [ { "header": "UEFOS0FK", "mti": "Data", "bitmap": "Name", "fieldNumber": 5, "data": "data", "name": "name", "recordType": "Data", "subRecords": [ { "header": "UEFOS0FK", "mti": "Data", "bitmap": "Name", "fieldNumber": 5, "data": "data", "name": "name", "recordType": "Data", "subRecords": null, "recordSchema": "Record schema", "pdsRecords": [] } ], "recordSchema": "Record schema", "pdsRecords": [] } ], "recordSchema": "Record schema", "pdsRecords": [] }

...