为什么 @JsonIgnore 的存在会影响 XML 编组?

问题描述 投票:0回答:1

我有一个公共类,其中包含使用

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>
java xml jackson jaxb moxy
1个回答
0
投票

尝试了一些方法后,我发现问题出现在

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.