Java JAXB可以初始化基类中的值吗?
我正在从事一个Scala项目,我们希望使用XML用JAXB(而不是Spring)初始化对象。我有一个层次结构,其中在子类中添加了更多的数据成员。一个简单的例子如下所示:Java JAXB可以初始化基类中的值吗?,java,xml,jaxb,xml-parsing,Java,Xml,Jaxb,Xml Parsing,我正在从事一个Scala项目,我们希望使用XML用JAXB(而不是Spring)初始化对象。我有一个层次结构,其中在子类中添加了更多的数据成员。一个简单的例子如下所示: class Animal { string name } class Cat extends Animal { int numLives } class Dog extends Animal { bool hasSpots } <Animals> <Cat> &l
class Animal
{
string name
}
class Cat extends Animal
{
int numLives
}
class Dog extends Animal
{
bool hasSpots
}
<Animals>
<Cat>
<name>Garfield</name>
<numLives>9</numLives>
</Cat>
<Dog>
<name>Odie</name>
<hasSpots>false</hasSpots>
</Dog>
</Animals>
我希望能够从如下所示的XML块初始化动物列表:
class Animal
{
string name
}
class Cat extends Animal
{
int numLives
}
class Dog extends Animal
{
bool hasSpots
}
<Animals>
<Cat>
<name>Garfield</name>
<numLives>9</numLives>
</Cat>
<Dog>
<name>Odie</name>
<hasSpots>false</hasSpots>
</Dog>
</Animals>
加菲猫
9
奥迪
假的
我们如何在类中设置注释来处理这个问题?在这种情况下,我更喜欢创建XSD模式并从中生成代码,这样您就安全了。
但要回答你的问题,是的,你可以。注释是XMLElement、XMLAttribute和XMLRootElement 对于本例,您需要使用
@xmlementref
和@XmlRootElement
注释。这与替换组的XML模式概念相对应。这将允许您拥有一个由元素区分的继承层次结构中的对象列表
动物
这将作为域模型的根对象。它有一个用@xmlementref
注释的列表
属性。这意味着它将根据其@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;
}
猫
我们将用@XmlRootElement
注释Cat
类。这与动物
上的@xmlementref
注释一起使用
package forum8356849;
import javax.xml.bind.annotation.*;
@XmlRootElement(name="Cat")
class Cat extends Animal
{
int numLives;
}
狗
我们还将向Dog
类添加@XmlRootElement
注释
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);
}
}
了解更多信息
@xmlsee({Cat.class,Dog.class})
意味着我需要在编译时了解我的权限。有什么办法吗?@fbl-您不需要使用XMLSee,但JAXBContext确实需要知道子类。您可能会发现以下方法更适合: