有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何结合DefaultTyping仅忽略@JsonSerialize注释

我看到了关于ignoring certain annotations的许多问题和答案,甚至禁用了所有注释:

.configure(MapperFeature.USE_ANNOTATIONS, false)

但是

  1. 第一个解决方案击败了DefaultTyping(类型不会以序列化JSON和
  2. 第二种解决方案击败了许多有用的注释,其中对我们来说最关键的是:java.beans.ConstructorProperties

我怎么能忽略@JsonSerialize并在生成的JSON中仍然包含typeinfo,同时仍然支持其他注释,如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注释的arg构造函数,而Jackson在正常情况下可以很好地处理这些构造函数

这是我无法解决的上述配置组合


共 (1) 个答案

  1. # 1 楼答案

    您是否尝试重写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注释并保留类型