2012-07-25 47 views
1

我在尝试对对象进行解组时遇到了继承问题。这里是我的类EclipseLink和Spring OXM继承问题

一个

@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; 
    } 
} 

Ç

@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> 

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

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

回答

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{ 
} 

B

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; 
    } 

} 

Ç

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。性能

要指定莫西为您的JAXB提供者,你需要包括在同一个包中的以下项域模型称为jaxb.properties文件(参见:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.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); 
    } 

} 

input.xml中/输出

<?xml version="1.0" encoding="UTF-8"?> 
<container> 
    <list-B> 
     <b b="BFied"/> 
    </list-B> 
    <list-C> 
     <c c="CField"/> 
    </list-C> 
</container> 
+1

非常感谢,看到这个详细的答案真是太好了。也许,我是一个糟糕的程序员,或者是一些神奇的东西出现。昨天,我保持相同的来源,然后再次运行程序,一切正常工作: - ? 。 EclipseLink为我节省了很多来自XML编组的时间,许多感谢eclipselink项目 – TuanAnh207 2012-07-26 03:26:14

+0

亲爱的Blaise,现在我想出了问题是如何发生的。我的项目是一个maven项目,在eclise内运行正常,但是当我使用“mvn测试”时,问题发生了。不明白为什么。 – TuanAnh207 2012-07-31 05:34:19