1

在尝试解组对象时,我遇到了继承问题。这是我的课

一个

@XmlRootElement(name="A")
public abstract class A{
}

@XmlRootElement(name="B")
public class B extends A{
   String bField;
   @XmlAttribute(name="b")
   public String getBField(){
     return bField;
   }
   public void setBField(String value){
     this.bField = value;
   }
}

C

@XmlRootElement(name="C")
public class C extends A{
  String cField;
  @XmlAttribute(name="c")
  public String getCField(){
     return cField;
  }
  public void setCField(String value){
     this.cField = value;
  } 
}

容器

@XmlRootElement(name="container")
public class Container{
   ArrayList<B> listB;
   ArrayList<C> listC;
   public ArrayList<B> getListB(){
       return listB;
   }
   @XmlElementWrapper(name="list-B")
   @XmlElement(name="b")
   public ArrayList<B> getListB(){
       return listB;
   }
   @XmlElementWrapper(name="list-C")
   @XmlElement(name="c")
   public ArrayList<C> getListC(){
       return listC;
   }
   public ArrayList<C> getListC(){
       return listC;
   }
}

然后输入XML文件

<container>
  <list-B>
    <b b="BFied"/>
  </list-B>
  <list-C>
    <c c="CField"/>
  </list-C>
</container>

我使用了与 Spring OXM 集成的 EclipseLink JAXB。当我将 xml 文件解组到 Container 的实例时,每件事都是重复的。在列表 B 中,我有 2 B 个重复的实例(与列表 C 相同)。

请让我知道我在哪里做错了?谢谢!

4

1 回答 1

0

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

我无法重现您所看到的问题。我正在使用可以从以下位置获得的 EclipseLink 2.4.0:

以下是我根据您的问题的完整代码:

一个

package forum11642669;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="A")
public abstract class A{
}

package forum11642669;

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "B")
public class B extends A {

    String bField;

    @XmlAttribute(name = "b")
    public String getBField() {
        return bField;
    }

    public void setBField(String value) {
        this.bField = value;
    }

}

C

package forum11642669;

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "C")
public class C extends A {

    String cField;

    @XmlAttribute(name = "c")
    public String getCField() {
        return cField;
    }

    public void setCField(String value) {
        this.cField = value;
    }

}

容器

您在问题中拥有的类的版本Container无法编译,因此我在下面对其进行了修改:

package forum11642669;

import java.util.ArrayList;
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "container")
public class Container {

    ArrayList<B> listB;
    ArrayList<C> listC;

    @XmlElementWrapper(name = "list-B")
    @XmlElement(name = "b")
    public ArrayList<B> getListB() {
        return listB;
    }

    public void setListB(ArrayList<B> listB) {
        this.listB = listB;
    }

    @XmlElementWrapper(name = "list-C")
    @XmlElement(name = "c")
    public ArrayList<C> getListC() {
        return listC;
    }

    public void setListC(ArrayList<C> listC) {
        this.listC = listC;
    }

}

jaxb.properties

要将 MOXy 指定为您的 JAXB 提供程序,您需要包含一个jaxb.properties在与域模型相同的包中调用的文件,其中包含以下条目(请参阅: http ://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as -你的.html )

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

演示

package forum11642669;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Container.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11642669/input.xml");
        Container container = (Container) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(container, System.out);
    }

}

输入.xml/输出

<?xml version="1.0" encoding="UTF-8"?>
<container>
   <list-B>
      <b b="BFied"/>
   </list-B>
   <list-C>
      <c c="CField"/>
   </list-C>
</container>
于 2012-07-25T09:59:25.187 回答