首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jackson Jaxb Annotation Precedence - @JsonProperty overriding @XmlTransient

Jackson Jaxb Annotation Precedence - @JsonProperty overriding @XmlTransient
EN

Stack Overflow用户
提问于 2012-12-29 05:50:24
回答 1查看 5.4K关注 0票数 9

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

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

代码语言:javascript
复制
setAnnotationIntrospector(AnnotationIntrospector.pair(
                 new JacksonAnnotationIntrospector(), 
                 new JaxbAnnotationIntrospector(getTypeFactory())));

基于以上内容,Jackson注释优先于Jaxb,因为自省程序的顺序。这是基于Jackson Jaxb的docs。对于我想忽略的字段,将@JsonIgnore添加到mix-in中的字段可以很好地工作。在现有类中有几个标记为@XmlTransient的字段,我不希望它们被忽略。我尝试将@JsonProperty添加到mix-in中的字段中,但似乎不起作用。

下面是原始的类:

代码语言:javascript
复制
public class Foo {
    @XmlTransient public String getBar() {...}
    public String getBaz() {...}
}

这里是混合使用的方法:

代码语言:javascript
复制
public interface FooMixIn {
    @JsonIgnore String getBaz(); //ignore the baz property
    @JsonProperty String getBar(); //override @XmlTransient with @JsonProperty
}

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

我还测试了将@JsonProperty添加到成员中,而不是使用mix-ins:

代码语言:javascript
复制
public class Foo {
    @JsonProperty @XmlTransient public String getBar() {...}
    @JsonIgnore public String getBaz() {...}
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-05 06:06:19

问题是,如果任何一个自检程序检测到忽略标记,AnnotationIntrospectorPair.hasIgnoreMarker()方法基本上都会忽略@JsonProperty

代码语言:javascript
复制
    public boolean hasIgnoreMarker(AnnotatedMember m) {
        return _primary.hasIgnoreMarker(m) || _secondary.hasIgnoreMarker(m);
    }

参考:github

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

代码语言:javascript
复制
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即可。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14076262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档