Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB可以初始化基类中的值吗?_Java_Xml_Jaxb_Xml Parsing - Fatal编程技术网

Java JAXB可以初始化基类中的值吗?

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

我正在从事一个Scala项目,我们希望使用XML用JAXB(而不是Spring)初始化对象。我有一个层次结构,其中在子类中添加了更多的数据成员。一个简单的例子如下所示:

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确实需要知道子类。您可能会发现以下方法更适合: