[英]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.