当前位置: 首页 > 知识库问答 >
问题:

EclipseLink和Spring OXM继承问题

姜学海
2023-03-14

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

A.

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

B

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

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

请让我知道我做错了什么?谢谢你!

共有1个答案

商弘义
2023-03-14

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

我无法重现您看到的问题。我正在使用EclipseLink 2.4。0,可从以下位置获取:

  • http://www.eclipse.org/eclipselink/downloads/

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

A.

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

}

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

要将MOXy指定为您的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/Output

<?xml version="1.0" encoding="UTF-8"?>
<container>
   <list-B>
      <b b="BFied"/>
   </list-B>
   <list-C>
      <c c="CField"/>
   </list-C>
</container>
 类似资料:
  • 问题内容: 我有三节课: 现在在我的主要职能中,我做这样的事情: 但这会产生2个编译时错误: 无法将A转换为fileHandler 无法将B转换为fileHandler 如果基类不是泛型的,那么我如何摆脱这些错误呢? 更新: 我的班级层次结构是: 调用函数的C类或 调用函数的D类。 C和D都从抽象类E派生。 现在,我应该如何在C和D以及E中定义这些功能: 我给出了以下内容: E: C: D: C,

  • FAQs in section [24]: [24.1] 如何表示“私有继承”? [24.2] 私有继承和组合(composition)有什么类似? [24.3] 我应该选谁:组合还是私有继承? [24.4] 从私有继承类到父类需要指针类型转换吗? [24.5] 保护继承和私有继承的关系是什么? [24.6] 私有继承和保护继承的访问规则是什么? 24.1 如何表示“私有继承”? 用 : priv

  • 问题内容: 我有一个Client和Affiliate类,它是从Person类继承的。正在使用联接的继承策略类型- 它们中的每一个都与父类共享主键。由于没有鉴别符列,我们选择使用DescriptorCustomizer和ClassExtractor。但是它并没有真正让人们知道它是如何工作的,而且代码似乎也没有编译。如果有人给出一个带有代码片段的漂亮示例以供理解,那将是很好的。 问题答案: 根据上述文

  • 本文向大家介绍关于C++中菱形继承和虚继承的问题总结,包括了关于C++中菱形继承和虚继承的问题总结的使用技巧和注意事项,需要的朋友参考一下 前言 菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之以接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口。在多重继承中建议使用“接口”,来避免多重继承中可能出现的各种问题。本文将给大家详细介绍关于C++菱形继承

  • 并尝试通过Hibernate使用策略连接实现继承,但当我使用此策略时,我收到异常: 奇怪的是,如果我选择另一个策略(单表或TABLE_PER_CLASS),错误不会出现

  • 在面向对象的程序设计中,定义一个新的 class 的时候,可以从某个现有的 class 继承,新的 class 称为子类,而被继承的 class 称为基类、父类或超类。 Python 中继承的语法如下: class Parent: pass class Child(Parent): pass 在第 1 行,定义了父类 Parent; 在第 4 行,定义了子类 Child,语法