当前位置: 首页 > 知识库问答 >
问题:

Jackson Jaxb批注优先-@JsonProperty重写@Xml瞬态

穆鸿波
2023-03-14

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

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

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

基于上述情况,由于内省者的顺序,Jackson注释优先于Jaxb。这是基于Jackson Jaxb文档的。对于我希望忽略的字段,将@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到成员,而不是使用混合:

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

我似乎得到了和混入时一样的行为。除非删除@Xml瞬态,否则该属性将被忽略。

共有1个答案

崔涵亮
2023-03-14

问题是,如果任何一个内窥镜检测到一个忽略标记,那么AnnotationAutomSpectorPair.hasIgnoreMarker()方法基本上忽略了@JsonProperty

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

参考:github

一种解决方法是对JaxbAnnotationAutomSpector进行子类化,以获得所需的行为:

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

 类似资料:
  • 我是这里的java新手,我在阅读注释和xml,我个人发现xml有很多优点,比如它可以放在应用程序之外,可以在不重新编译类文件的情况下进行更改。如果我使用注释,如果我需要进行更改,则需要转到源代码并重新编译。如果是这样,我们为什么要使用注释

  • 没有重写jackson从getter获得的默认名称。如果我用和jackson序列化下面的类,我会得到 如您所见,JsonProperty注释不起作用 将放在字符串本身也不起作用。我可以改变名字的唯一方法是重命名getter,唯一的问题是它的第一个字母总是小写的

  • 在启动Quarkus应用程序时 java-jar目标/quarkus应用程序/quarkus运行。罐子 或者用一个打包好的Uber罐子: ClassNotFoundException:javax。注释。优先事项 但是当我从IntelliJ或与 mvn quarkus:dev 一切都开始得很好。 完整堆栈跟踪: $java-jar目标/quarkus应用程序/quarkus运行。线程“main”ja

  • 但没有任何例子。 你能举个例子吗?

  • 我在Java使用PriorityQueue。 我有一个结构如下的对象: 优先考虑的是从最便宜到最贵的成本: 我使用add将对象包含在队列中。 它适用于队列中的每个元素,但我添加的最后一个元素总是位于底部。 我做错了什么?

  • 我正在尝试用play vars_prompt变量重写inventory group_vars/all变量。考虑下面的代码: inventory/group_vars/all.yml test.yml 我想用var1和var2(用vars_prompt接受的值)代替test1和test2(在inventory/group_vars/all.yml中设置的值)重写variable_1和variable