java – JAXB和继承在编组时起作用;但不是解组

我想编组/解组继承另一个类的类的对象.

我从课程开始:

import java.util.List;

public class Thing {
  private List<String> strings;

  public List<String> getStrings() {
    return strings;
  }

  public void setStrings(List<String> strings) {
    this.strings = strings;
  }
}

我扩展了这个类并使用JAXB注释对其进行注释.

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class JaxbThing extends Thing {

  // @XmlElementWrapper(name = "list")
  @XmlElementWrapper(name = "strings")
  @XmlElement(name = "string")
  public List<String> getStrings() {
    return super.getStrings();
  }

  public void setStrings(List<String> string) {
    super.setStrings(string);
  }
}

然后我运行以下编组/解组程序:

import java.io.File;
import java.util.Arrays;
import javax.xml.bind.*;

public class Main {
  public static void main(String[] args) {
    JaxbThing t = new JaxbThing();
    t.setStrings(Arrays.asList("a", "b", "c"));
    try {
      File f = new File("jaxb-file.xml");

      JAXBContext context = JAXBContext.newInstance(JaxbThing.class);

      Marshaller m = context.createMarshaller();
      m.marshal(t, f);

      Unmarshaller um = context.createUnmarshaller();
      JaxbThing t2 = (JaxbThing) um.unmarshal(f);

      System.out.println(t2.getStrings());  // I expect to see [a, b, c]

    } catch (JAXBException e) {
      e.printStackTrace();
    }
  }
}

XML文件的内容是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxbThing>
    <strings>
        <string>a</string>
        <string>b</string>
        <string>c</string>
    </strings>
</jaxbThing>

一切似乎都是正确的.但解密的结果让我感到惊讶,因为控制台显示:

[
    ]

当我期望看到[a,b,c]时

如果我以这种方式注释strings属性:

  @XmlElementWrapper(name = "list")
  // @XmlElementWrapper(name = "strings")
  @XmlElement(name = "string")
  public List<String> getStrings() {
    return super.getStrings();
  }

然后控制台显示预期的[a,b,c].

我想JAXB unmarshaler正在使用类Thing而不是JaxbThing来解组XML文件内容.事实上,如果我使用@XmlTransient注释类Thing,我会得到预期的结果.

但是我不明白JAXB的这种行为.

有人可以解释一下吗,拜托?先感谢您.

最佳答案 问题是您要从父类重写属性. JAXB认为JAXBThing有“

>一个名为strings(继承自String)的属性,映射到元素字符串.
>一个名为strings的属性(在JAXBThing上定义,映射到元素字符串下的元素字符串).

如果在JAXBThing的setStrings方法中设置断点,您将看到它首先使用正确的数据调用,然后第二次使用不正确的数据来覆盖初始集(因为它认为它们是共享的不同属性一个二传手.

您始终可以通过使用@XmlTransient对其进行注释来删除Thing类.

import java.util.List;
import javax.xml.bind.annotation.XmlTransient;

@XmlTransient
public class Thing {
  private List<String> strings;

  public List<String> getStrings() {
    return strings;
  }

  public void setStrings(List<String> strings) {
      System.out.println("Thing" + strings);
    this.strings = strings;
  }

}

欲获得更多信息

> http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html

点赞