我已经看到了许多有关ignoring certain annotations的问题和答案,甚至禁用了所有注释:
.configure(MapperFeature.USE_ANNOTATIONS, false)
但
第一个解决方案击败了DefaultTyping(类型不会以序列化的JSON和
第二种解决方案破坏了许多有用的注释,其中最重要的注释对我们来说是
java.beans.ConstructorProperties
。在仍然支持其他注释(例如
@JsonSerialize
)的同时,如何忽略ConstructorProperties
并在生成的JSON中保留typeinfo?这是我到目前为止的内容:
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
注释的无参数构造函数,在正常情况下Jackson可以很好地处理。这是我无法解决的上述配置组合。
最佳答案
您是否尝试覆盖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
批注并保持类型。