我正在开发一个Scala项目,我们希望使用XML来使用JAXB(而不是Spring)初始化我们的对象。我有一个层次结构,在子类中添加更多的数据成员。一个简单的例子看起来像这样:
class Animal
{
string name
}
class Cat extends Animal
{
int numLives
}
class Dog extends Animal
{
bool hasSpots
}
我希望能够从XML块初始化动物列表,如下所示:
<Animals>
<Cat>
<name>Garfield</name>
<numLives>9</numLives>
</Cat>
<Dog>
<name>Odie</name>
<hasSpots>false</hasSpots>
</Dog>
</Animals>
我们如何在类中设置注释以便能够处理这个?
答案 0 :(得分:3)
对于此示例,您需要使用@XmlElementRef
和@XmlRootElement
注释。这对应于替换组的XML模式概念。这将允许您具有由元素区分的继承层次结构中的对象列表。
<强>动物强>
这将作为域模型的根对象。它有List
属性,注明@XmlElementRef
。这意味着它将根据其@XmlRootElement
注释的值匹配值。
package forum8356849;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Animals")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({Cat.class, Dog.class})
public class Animals {
@XmlElementRef
private List<Animal> animals;
}
<强>动物强>
package forum8356849;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
class Animal
{
String name;
}
<强>猫强>
我们将使用Cat
注释对@XmlRootElement
类进行注释。这与@XmlElementRef
上的Animals
注释一起使用。
package forum8356849;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Cat")
class Cat extends Animal
{
int numLives;
}
<强>狗强>
我们还会在@XmlRootElement
类中添加Dog
注释。
package forum8356849;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Dog")
class Dog extends Animal
{
boolean hasSpots;
}
<强>演示强>
您可以使用以下类来查看一切都按预期工作。 input.xml
对应于您问题中提供的XML。
package forum8356849;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Animals.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum8356849/input.xml");
Animals animals = (Animals) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(animals, System.out);
}
}
更多信息
答案 1 :(得分:0)
在这种情况下,我更喜欢创建XSD架构并从中生成代码,因此您可以放心使用。 但要回答你的问题,是的,你可以。注释是XMLElement,XMLAttribute,XMLRootElement。