簡體   English   中英

JAXB缺少元素列表中的字段

[英]JAXB missing fields in list of elements

我有一個問題,對於可以包含彼此並且都擴展基類的類層次結構,其中一個在添加到“基礎”對象列表時不會顯示詳細信息。 因為原因,我必須使用JAXB,所以我試圖找出丟失或錯誤的內容。 我已將其剝離為下面的示例代碼。

public class BaseSchema {}

@XmlRootElement(name="ObjectA")
@XmlAccessorType(XmlAccessType.FIELD)
public class ObjectA extends BaseSchema {
  private String thingA;
  @XmlElementWrapper(name="listOfBs")
  @XmlElement(name="b-item")
  private List<ObjectB> listB = new ArrayList<>();
  // getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class ObjectB extends BaseSchema {
  private String thingB;
  @XmlElementWrapper(name="listOfCs")
  @XmlElement(name="c-item")
  private List<ObjectC> listC = new ArrayList<>();
  // getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class ObjectC extends BaseSchema {
  private String thingC;
  @XmlElementWrapper(name="listOfBases")
  @XmlElement(name="base-item")
  private List<BaseSchema> listBase = new ArrayList<>();
  // getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class ObjectD extends BaseSchema {
  private String thingD;
  // getter and setter
}

我的根始終是已知的元素類型( ObjectA ),因此它是唯一一個帶有XmlRootElement標記的XmlRootElement 現在,對於一個A的樣本數據集,持有一個B持有一個C其中包含一些C ,這就是編組輸出(首先是JAXB,然后是XStream以顯示數據存在)。 你可以看到JAXB只是為D項輸出一個'blank'元素,沒有任何內部字段 - 但其余的工作都很好。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ObjectA>
    <thingA>Base element</thingA>
    <listOfBs>
        <b-item>
            <thingB>B1</thingB>
            <listOfCs>
                <c-item>
                    <thingC>C1</thingC>
                    <listOfBases>
                        <base-item xsi:type="objectA" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                            <thingA>A1</thingA>
                            <listOfBs/>
                        </base-item>
                        <base-item/>
                        <base-item xsi:type="objectA" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                            <thingA>A2</thingA>
                            <listOfBs/>
                        </base-item>
                        <base-item xsi:type="objectB" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                            <thingB>B2</thingB>
                            <listOfCs/>
                        </base-item>
                        <base-item xsi:type="objectC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                            <thingC>C2</thingC>
                            <listOfBases/>
                        </base-item>
                        <base-item/>
                    </listOfBases>
                </c-item>
            </listOfCs>
        </b-item>
    </listOfBs>
</ObjectA>

===================
<test.schema.ObjectA>
  <thingA>Base element</thingA>
  <listB>
    <test.schema.ObjectB>
      <thingB>B1</thingB>
      <listC>
        <test.schema.ObjectC>
          <thingC>C1</thingC>
          <listBase>
            <test.schema.ObjectA>
              <thingA>A1</thingA>
              <listB/>
            </test.schema.ObjectA>
            <test.schema.ObjectD>
              <thingD>D1</thingD>
            </test.schema.ObjectD>
            <test.schema.ObjectA>
              <thingA>A2</thingA>
              <listB/>
            </test.schema.ObjectA>
            <test.schema.ObjectB>
              <thingB>B2</thingB>
              <listC/>
            </test.schema.ObjectB>
            <test.schema.ObjectC>
              <thingC>C2</thingC>
              <listBase/>
            </test.schema.ObjectC>
            <test.schema.ObjectD>
              <thingD>D2</thingD>
           </test.schema.ObjectD>
          </listBase>
        </test.schema.ObjectC>
      </listC>
    </test.schema.ObjectB>
  </listB>
</test.schema.ObjectA>
===================

用於創建輸出的代碼:

public class MarshalTest {
  public void test() throws Exception {
    ObjectA base = new ObjectA();
    base.setThingA("Base element");

    ObjectB b1 = new ObjectB();
    b1.setThingB("B1");
    base.getListB().add(b1);

    ObjectC c1 = new ObjectC();
    c1.setThingC("C1");
    b1.getListC().add(c1);

    ObjectA a1 = new ObjectA();
    a1.setThingA("A1");
    c1.getListBase().add(a1);

    ObjectD d1 = new ObjectD();
    d1.setThingD("D1");
    c1.getListBase().add(d1);

    ObjectA a2 = new ObjectA();
    a2.setThingA("A2");
    c1.getListBase().add(a2);

    ObjectB b2 = new ObjectB();
    b2.setThingB("B2");
    c1.getListBase().add(b2);

    ObjectC c2 = new ObjectC();
    c2.setThingC("C2");
    c1.getListBase().add(c2);

    ObjectD d2 = new ObjectD();
    d2.setThingD("D2");
    c1.getListBase().add(d2);

    JAXBContext jaxbContext = JAXBContext.newInstance(base.getClass());
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    StringWriter writer = new StringWriter();

    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    jaxbMarshaller.marshal(base, writer);
    System.out.println(writer.toString());
  }

我認為問題是JAXB不知道你的ObjectD類。 您可以嘗試將@XmlSeeAlso({ ObjectA.class, ObjectB.class, ObjectC.class, ObjectD.class })BaseSchema類嗎? 例如

@XmlSeeAlso({ ObjectA.class, ObjectB.class, ObjectC.class, ObjectD.class }
public class BaseSchema {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM