我使用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瞬态,否则该属性将被忽略。
问题是,如果任何一个内窥镜检测到一个忽略标记,那么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