gpt4 book ai didi

interface - JAXB 注释 - 映射接口(interface)和 @XmlElementWrapper

转载 作者:行者123 更新时间:2023-12-04 14:21:16 24 4
gpt4 key购买 nike

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

@XmlAnyElement
private List<Animal> animals;

每件事都正常工作。但是当我添加一个包装元素时,例如:
@XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;

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

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

我正在研究使用位于此处的注释映射接口(interface)的示例:
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 {}
}

最佳答案

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

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

关于interface - JAXB 注释 - 映射接口(interface)和 @XmlElementWrapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1159159/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com