6

我遇到了一个字段的 JAXB 注释问题,该字段是一个泛型类型为接口的列表。当我声明它时:

@XmlAnyElement
private List<Animal> animals;

每件事都正常工作。但是当我添加一个包装器元素时,例如:

@XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;

我发现 Java 对象编组正确,但是当我解组编组创建的文档时,我的列表为空。我已在代码下方发布以演示此问题。

我做错了什么,还是这是一个错误?我已经用 2.1.12 和 2.2-ea 版本进行了尝试,结果相同。

我正在研究使用位于此处的注释映射接口的示例: https://jaxb.dev.java.net/guide/Mapping_interfaces.html

@XmlRootElement
class Zoo {

  @XmlElementWrapper
  @XmlAnyElement(lax = true)
  private List<Animal> animals;

  public static void main(String[] args) throws Exception {
    Zoo zoo = new Zoo();
    zoo.animals = new ArrayList<Animal>();
    zoo.animals.add(new Dog());
    zoo.animals.add(new Cat());

    JAXBContext jc = JAXBContext.newInstance(Zoo.class, Dog.class, Cat.class);
    Marshaller marshaller = jc.createMarshaller();

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    marshaller.marshal(zoo, os);

    System.out.println(os.toString());

    Unmarshaller unmarshaller = jc.createUnmarshaller();
    Zoo unmarshalledZoo = (Zoo) unmarshaller.unmarshal(new ByteArrayInputStream(os.toByteArray()));

    if (unmarshalledZoo.animals == null) {
      System.out.println("animals was null");
    } else if (unmarshalledZoo.animals.size() == 2) {
      System.out.println("it worked");
    } else {
      System.out.println("failed!");
    }
  }

  public interface Animal {}

  @XmlRootElement
  public static class Dog implements Animal {}

  @XmlRootElement
  public static class Cat implements Animal {}
} 
4

5 回答 5

8

应该使用 @XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)}) 私有列表动物;

或仅使用 @XmlAnyElement(lax = true),并将 Dog.class、Cat.class 添加到 JaxbContext

于 2011-02-28T14:49:34.537 回答
1

这是在 JAXB 2.1.13 中修复的错误。更新您的库或使用 JDK 1.7 或更高版本,问题将得到解决。

于 2015-03-19T11:34:22.137 回答
0

当我使用 jdk1.6.0_20 运行您的测试程序时,它似乎可以工作,并且我得到以下输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo><animals><dog/><cat/></animals></zoo>
it worked
于 2010-07-29T13:26:46.117 回答
0

您是否尝试过将注释放入配件中?我之前在@XmlElementWrapper 上也遇到过这个问题,但是我通过注释我的getter 而不是注释字段声明来解决它。

于 2010-12-20T02:48:14.190 回答
0

当我使用 jdk1.6.0_20 运行您的测试程序时,它不起作用,但是一旦我将列表的注释从 更改为 ,@XmlAnyElement(lax = true)@XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)})就会起作用。没关系,Dog.class是否Cat.class添加到 JAXBContext 中。

于 2011-09-12T18:17:28.830 回答