Почему Jackson пытается сериализовать геттер несмотря на setVisibility(PropertyAccessor.ALL,Visibility.NONE)?
Я пытаюсь сериализовать класс java.awt.Rectangle или java.awt.geom.Rectangle2D в .json-файл. При этом я отключаю геттеры в ObjectMapper-е:
System.out.println(new ObjectMapper()
.addMixIn(Object.class,IdMixIn.class)
.setVisibility(PropertyAccessor.GETTER,Visibility.NONE)
.setVisibility(PropertyAccessor.ALL,Visibility.NONE)
// .setVisibility(PropertyAccessor.FIELD,Visibility.ANY)
.activateDefaultTyping(
BasicPolymorphicTypeValidator.builder()
.allowIfBaseType(Serializable.class)
.build(),
ObjectMapper.DefaultTyping.NON_FINAL_AND_ENUMS,
JsonTypeInfo.As.PROPERTY
).enable(SerializationFeature.INDENT_OUTPUT)
.writeValueAsString(new Rectangle(0,0,10,10))
);
IdMixIn:
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class,property="@Id")
private static interface IdMixIn{}
Не взирая на .setVisibility(PropertyAccessor.ALL,Visibility.NONE), Jackson отчаянно пытается сериализовать результат вызова getBounds2D() (копия прямоугольника), что приводит к бесконечной рекурсии:
java.io.UncheckedIOException: com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.awt.Rectangle["bounds2D"]->java.awt.Rectangle["bounds2D"]->java.awt.Rectangle["bounds2D"]->java.awt.Rectangle["bounds2D"]->java.awt.Rectangle["bounds2D"]->java.awt.Rectangle["bounds2D"]->java.awt.Rectangle["bounds2D"]->java.awt.Rectangle["bounds2D"]->java.awt.Rectangle["bounds2D"]->java.awt.Rectangle["bounds2D"]->...
Как это отключить?
Ответы (1 шт):
Автор решения: Tech of the Absence
→ Ссылка
Кажется, это какая-то ошибка в Jackson, хотя я не могу наверняка утверждать, что это так. Может, есть специальные обработчики для некоторых пакетов, а может в названии getBounds2D() он находит какие-то особые черты.
Проблема решается внедрением дополнительного MixIn-а (или модификацией старого):
@JsonAutoDetect(getterVisibility = Visibility.NONE,isGetterVisibility = Visibility.NONE)
private static interface NoGettersMixIn{}