我有以下类层次结构:
@XmlRootElement
public abstract class Animal{}
@XmlRootElement
public class Dog extends Animal{}
@XmlRootElement
public class Cat extends Animal{}
@XmlRootElement
public class Lion extends Animal{}
和一个具有名为 Animal 的属性的类:
@XmlRootElement
public class Owner{
private Animal animal;
}
我想允许不同的 XML 模式,如下所示,并将模式中的动物类型绑定到animal object
in Owner class
<Owner>
<Dog></Dog>
</Owner>
<Owner>
<Cat></Cat>
</Owner>
<Owner>
<Lion></Lion>
</Owner>
我发现有用的解决方案XmlElements
这可能需要多个XmlElement
字段并创建一个集合。但是,就我而言,我不需要集合,而是单个属性。
JAXB 是否允许任何 XmlElement 多重命名约定来解决此问题?
有没有其他注释可以解决这个问题?
注意:我在 stackoverflow 和周围查看了类似问题的多个答案,但几乎所有答案都创建了一个集合而不是单个对象。我找到的最接近的答案是:@XmlElement 具有多个名称 https://stackoverflow.com/questions/24554789/xmlelement-with-multiple-names
编辑:我认为this http://blog.bdoughan.com/2010/10/jaxb-and-xsd-choice-xmlelements.html解决方案可能有效。必须测试一下
我让它工作使用@XmlElements http://docs.oracle.com/javaee/7/api/javax/xml/bind/annotation/XmlElements.html注释,如下:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) throws JAXBException {
String xml = "<owner><dog></dog></owner>";
JAXBContext jaxbContext = JAXBContext.newInstance(Owner.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Owner owner = (Owner) jaxbUnmarshaller.unmarshal(
new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
System.out.println(owner.getAnimal().getClass());
}
}
abstract class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
class Lion extends Animal {}
@XmlRootElement
class Owner {
@XmlElements({
@XmlElement(name = "dog", type = Dog.class),
@XmlElement(name = "cat", type = Cat.class),
@XmlElement(name = "lion", type = Lion.class)
})
private Animal animal;
public Animal getAnimal() {
return animal;
}
}
使用 Oracle Java 8 SDK 附带的默认 JAXB 实现,将打印出:
class Dog
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)