Jackson Jaxb注释优先级-@JsonProperty重写@XmlTransient

Jackson Jaxb注释优先级-@JsonProperty重写@XmlTransient,json,jaxb,jackson,Json,Jaxb,Jackson,我正在使用Jackson(2.1.1)进行JSON序列化/反序列化。我有一个带有JAXB注释的现有类。大多数注释都是正确的,可以像jackson一样使用。我使用mix-ins稍微改变这些类的反序列化/序列化 在ObjectMapper构造函数中,我执行以下操作: setAnnotationIntrospector(AnnotationIntrospector.pair( new JacksonAnnotationIntrospector(),

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

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

setAnnotationIntrospector(AnnotationIntrospector.pair(
                 new JacksonAnnotationIntrospector(), 
                 new JaxbAnnotationIntrospector(getTypeFactory())));
基于上述情况,由于内省者的顺序,Jackson注释优先于Jaxb。这是基于jacksonjaxb的。对于我希望忽略的字段,将
@JsonIgnore
添加到mix-in中的字段可以正常工作。在现有类中,有几个字段标记为
@xmltransive
,我不希望忽略这些字段。我曾尝试将
@JsonProperty
添加到mix-in中的字段,但似乎不起作用

以下是原始类:

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,而不是使用mix-ins:

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

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

问题在于
AnnotationIntroSectorPair.hasIgnoreMarker()
方法基本上会忽略
@JsonProperty
,如果内省器检测到忽略标记:

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

一种解决方法是将
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);
        }
    }
}
然后只需使用
annotationintrospector对中的
CustomJaxbAnnotationIntrospector