Я видел множество вопросов и ответов о игнорировании определенных аннотаций или даже отключении всех аннотаций:
.configure(MapperFeature.USE_ANNOTATIONS, false)
Но
- первое решениепобеждает DefaultTyping (типы не заканчиваются в сериализованном JSON, и
- второе решение побеждает многие полезные аннотации, из которых наиболее критичные для нас:
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
, с которыми Джексон может нормально справиться в обычных условиях.
Это комбинация конфигурации, описанная выше, которую я не могу решить.