1

オブジェクトに非整列化しようとしているときに、継承の問題に悩まされています。ここに私のクラスがあります

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

@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 ファイルをコンテナーのインスタンスに非整列化すると、すべてが複製されます。リスト 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{
}

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.properties

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/出力

<?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 に答える