Почему 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{}
→ Ссылка