我有一个公共类,其中包含使用
JAXB
编组/解组 XML 的字段以及使用 Jackson
库对 JSON 进行序列化/反序列化的字段。其中一个字段 type
具有注释 @XmlTransient
,表示在 XML 编组期间应忽略它,而 @JsonIgnore
表示应在 JSON 序列化期间忽略它。
但是我面临的问题是,当我同时拥有注释并尝试编组该类时,我会在编组过程中在 XML 中获得
type
标记。当我删除 @JsonIgnore
并且其余所有内容都相同时,我在 XML 中看不到 type
。
我想知道为什么
@JsonIgnore
会在编组过程中引起问题?为什么 @JSONIgnore 的存在会影响 XML 编组,因为两者都来自不同的库?
以下是我的课程:
以下是我的家长课:
Parent.java:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, visible = true, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Child.class, name = "Child")
})
@JsonInclude(Include.NON_NULL)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlTransient
@Builder
public class Person implements Serializable {
@XmlTransient
@JsonIgnore
private String type;
private String name;
private String age;
}
以下是我的子类,它继承了父类:
@XmlType(
name = "Child",
propOrder = {
"name",
"age",
"nickname"
},
factoryClass = ObjectFactory.class,
factoryMethod = "createPerson")
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
visible = true,
property = "type")
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Child")
@JsonPropertyOrder({
"type",
"name",
"age",
"nickname"
})
public class Child extends Person implements XmlSupportExtension {
private String nickname;
}
以下是我的接口XmlSupportExtension.java:
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
visible = true,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Child.class, name = "Child")
})
@JsonIgnoreProperties(ignoreUnknown = true)
@XmlSeeAlso({
Child.class
})
public interface XmlSupportExtension {
Object xmlSupport();
}
ObjectFactory.java:
import jakarta.xml.bind.annotation.XmlRegistry;
@XmlRegistry
public final class ObjectFactory {
private ObjectFactory() {}
// Returns Child
public static Child createPerson() {
return new Child();
}
}
编组期间预期的 XML:
<child>
<name>Batman</name>
<age>50</age>
<nickname>Batman</nickname>
</child>
当前生成的 XML:
<child>
<name>Batman</name>
<age>50</age>
<nickname>Batman</nickname>
<type>child</type>
</child>
尝试了一些方法后,我发现问题出现在
XMLSupportExtension
中,所以我删除了 visible = true,
,这对我有用。现在添加 @JsonIgnore 不会在 XML 编组期间产生任何问题。
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Child.class, name = "Child")
})
@JsonIgnoreProperties(ignoreUnknown = true)
@XmlSeeAlso({
Child.class
})
public interface XmlSupportExtension {
Object xmlSupport();
}