Как игнорировать только аннотации @JsonSerialize в сочетании с DefaultTyping - PullRequest
1 голос
/ 31 октября 2019

Я видел множество вопросов и ответов о игнорировании определенных аннотаций или даже отключении всех аннотаций:

.configure(MapperFeature.USE_ANNOTATIONS, false)

Но

  1. первое решениепобеждает DefaultTyping (типы не заканчиваются в сериализованном JSON, и
  2. второе решение побеждает многие полезные аннотации, из которых наиболее критичные для нас: java.beans.ConstructorProperties.

Какмогу ли я проигнорировать @JsonSerialize и по-прежнему иметь typeinfo в моем результирующем JSON, при этом поддерживая другие аннотации, такие как ConstructorProperties?

Вот что у меня есть:

private static ObjectMapper configureObjectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.As.PROPERTY);
    mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
        @Override
        protected TypeResolverBuilder<?> _findTypeResolver(MapperConfig<?> config, Annotated ann, JavaType baseType) {
            if (ann.hasAnnotation(JsonSerialize.class) || ann.hasAnnotation(JsonDeserialize.class)) {
                return StdTypeResolverBuilder.noTypeInfoBuilder(); // or null
            }
            return super._findTypeResolver(config, ann, baseType);
        }
    });
    return mapper;
}
// or the same config using a JsonMapper builder

Но это все ещеобрабатывает @JsonSerialize по какой-то причине. Я нахожусь на Джексоне 2.10.0.pr3.


Реальная проблема, с которой я сталкиваюсь, заключается в том, что я сериализую сторонние объекты, которые содержат предоставленные @JsonSerialize для несвязанных целей, но без определения @JsonDeserialize. Несмотря на то, что они идеально сериализуемы без этих аннотаций, они блокируют нашу десериализацию. В то же время я не знаю заранее, какие это классы, так чтоон должен быть закодирован в результирующем JSON. Кроме того, некоторые из этих объектов генерируются с помощью Lombok, в результате чего конструкторы без аргументов помечаются java.beans.ConstructorProperties, с которыми Джексон может нормально справиться в обычных условиях.

Это комбинация конфигурации, описанная выше, которую я не могу решить.

1 Ответ

0 голосов
/ 02 ноября 2019

Вы пытались переопределить JacksonAnnotationIntrospector#findSerializer метод:

class SkipSerializersJacksonAnnotationIntrospector extends JacksonAnnotationIntrospector {

    private final List<Class> classesToSkip = new ArrayList<>();

    public SkipSerializersJacksonAnnotationIntrospector() {
        classesToSkip.add(YourClass.class);
    }

    @Override
    public Object findSerializer(Annotated a) {
        if (classesToSkip.contains(a.getRawType())) {
            return null;
        }

        return super.findSerializer(a);
    }
}

Это должно позволить вам пропустить JsonSerialize аннотацию и сохранить тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...