jsonamazon-ion

InvalidDefinitionException: Direct self-reference leading to cycle. Trying to serialize a class with a member as IonValue to IonValue


I have an object which has one of its member as IonValue. I am trying serialize the entire object to IonValue and I'm getting InvalidDefinitionException.

Serialization code which throws the Exception : ionMapper.writeValueAsIonValue(CustomerClassObject)

public class CustomerClass {

    private final String employeeId;
    private final String businessId;
    private final String customerName;
   
    private final IonValue eventVal;
    private final Map<String, String> additionalParams;
}

and my IonObjectMapper is initialized as below

public IonObjectMapper createJacksonIonMapper() {
        final IonObjectMapper mapper = new IonObjectMapper();
        mapper.setCreateBinaryWriters(true);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return mapper;
    }

Exception stack trace:

InvalidDefinitionException: Direct self-reference leading to cycle (through reference chain: com.software.model.CustomerClass["eventVal"]->software.amazon.ion.impl.lite.IonStructLite["symbolTable"]->software.amazon.ion.impl.SharedSymbolTable["systemSymbolTable"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.12.3.jar:?]
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1276) ~[jackson-databind-2.12.3.jar:?]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter._handleSelfReference(BeanPropertyWriter.java:944) ~[jackson-databind-2.12.3.jar:?]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:722) ~[jackson-databind-2.12.3.jar:?]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.3.jar:?]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.3.jar:?]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.3.jar:?]
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.3.jar:?]
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.3.jar:?]
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.3.jar:?]

Solution

  • Could look at IonValueMapper:

    http://fasterxml.github.io/jackson-dataformats-binary/javadoc/ion/2.10/com/fasterxml/jackson/dataformat/ion/ionvalue/IonValueMapper.html

    Direct serialization to and from IonValue fields is supported. The POJO can declare fields of type IonValue (or a subclass) and the direct value will be provided.

    EDIT: IonValueMapper is a subclass of IonObjectMapper.