#json #ion
Вопрос:
У меня есть объект, один из членов которого имеет значение IonValue. Я пытаюсь сериализовать весь объект в IonValue и получаю исключение InvalidDefinitionException.
Код сериализации, который создает исключение : 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;
}
и мой IonObjectMapper инициализируется, как показано ниже
public IonObjectMapper createJacksonIonMapper() {
final IonObjectMapper mapper = new IonObjectMapper();
mapper.setCreateBinaryWriters(true);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
Трассировка стека исключений:
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:?]
Ответ №1:
Мог бы посмотреть на IonValueMapper
:
Поддерживается прямая сериализация полей IonValue и из них. POJO может объявлять поля типа IonValue (или подкласса), и будет предоставлено прямое значение.
РЕДАКТИРОВАТЬ: IonValueMapper
является подклассом IonObjectMapper
.
Комментарии:
1. Но IonValueMapper не является подклассом IonObjectMapper ;).
2. @Вишварам Санкаран, что ты имеешь в виду? IonValueMapper расширяет IonObjectMapper, делая его подклассом IonObjectMapper.
3. Существует две версии IonValueMapper, одна из которых происходит от JoiObjectMapper, а другая-от IonObjectMapper.