【问题标题】:Jackson Jaxb Annotation Precedence - @JsonProperty overriding @XmlTransientJackson Jaxb 注释优先级 - @JsonProperty 覆盖 @XmlTransient
【发布时间】:2012-12-14 02:49:04
【问题描述】:

我正在使用 Jackson (2.1.1) 进行 JSON 序列化/反序列化。我有一个带有 JAXB 注释的现有类。这些注释中的大多数都是正确的,可以按原样与杰克逊一起使用。我正在使用 mix-ins 来稍微改变这些类的反序列化/序列化。

在我的 ObjectMapper 构造函数中,我执行以下操作:

setAnnotationIntrospector(AnnotationIntrospector.pair(
                 new JacksonAnnotationIntrospector(), 
                 new JaxbAnnotationIntrospector(getTypeFactory())));

基于上述,Jackson 注释优先于 Jaxb,因为自省的顺序。这是基于 Jackson Jaxb docs。对于我想忽略的字段,将@JsonIgnore 添加到混合中的字段可以正常工作。在现有的类中有几个字段标记为@XmlTransient,我不想忽略它们。我已经尝试将@JsonProperty 添加到混入的字段中,但它似乎不起作用。

这是原来的类:

public class Foo {
    @XmlTransient public String getBar() {...}
    public String getBaz() {...}
}

这是混音:

public interface FooMixIn {
    @JsonIgnore String getBaz(); //ignore the baz property
    @JsonProperty String getBar(); //override @XmlTransient with @JsonProperty
}

知道如何在不修改原始类的情况下解决此问题吗?

我还测试了将@JsonProperty 添加到成员而不是使用混合:

public class Foo {
    @JsonProperty @XmlTransient public String getBar() {...}
    @JsonIgnore public String getBaz() {...}
}

我似乎得到了与混入相同的行为。除非删除 @XmlTransient,否则该属性将被忽略。

【问题讨论】:

    标签: json jaxb jackson


    【解决方案1】:

    问题是AnnotationIntrospectorPair.hasIgnoreMarker() 方法基本上会忽略@JsonProperty 如果任一内省检测到忽略标记:

        public boolean hasIgnoreMarker(AnnotatedMember m) {
            return _primary.hasIgnoreMarker(m) || _secondary.hasIgnoreMarker(m);
        }
    

    参考:github

    一种解决方法是将JaxbAnnotationIntrospector 子类化以获得所需的行为:

    public class CustomJaxbAnnotationIntrospector extends JaxbAnnotationIntrospector {
        public CustomJaxbAnnotationIntrospector(TypeFactory typeFactory) {
            super(typeFactory);
        }
    
        @Override
        public boolean hasIgnoreMarker(AnnotatedMember m) {
            if ( m.hasAnnotation(JsonProperty.class) ) {
                return false;
            } else {
                return super.hasIgnoreMarker(m);
            }
        }
    }
    

    然后只需在AnnotationIntrospectorPair 中使用CustomJaxbAnnotationIntrospector

    【讨论】:

      猜你喜欢
      • 2014-05-17
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 2012-02-25
      • 2010-12-07
      相关资源
      最近更新 更多