Java JAXB元素列表中缺少字段
我遇到了一个问题,对于一个可以相互包含并扩展基类的类层次结构,其中一个类在添加到“基”对象列表时不会显示详细信息。由于种种原因,我不得不使用JAXB,所以我试图找出遗漏或错误的地方。我已经把它简化为下面的示例代码Java JAXB元素列表中缺少字段,java,jaxb,Java,Jaxb,我遇到了一个问题,对于一个可以相互包含并扩展基类的类层次结构,其中一个类在添加到“基”对象列表时不会显示详细信息。由于种种原因,我不得不使用JAXB,所以我试图找出遗漏或错误的地方。我已经把它简化为下面的示例代码 public class BaseSchema {} @XmlRootElement(name="ObjectA") @XmlAccessorType(XmlAccessType.FIELD) public class ObjectA extends BaseSchema { p
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
}
创建输出的代码:
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类。您是否可以尝试将
@xmlseealway({ObjectA.class,ObjectB.class,ObjectC.class,ObjectD.class})
添加到BaseSchema
类中?
e、 g
你能准备一份吗?也就是说,包括创建对象结构的代码,并将其添加到有效的问题中!我不明白为什么它能“找到”A、B和C,尽管如此。也许在这些其他类中包含其他内部JAXB注释使它们“可见”?我尝试向
ObjectD.thingD
字段添加xmlement
注释,但没有任何帮助,所以我不确定。太棒了!不知何故,其他类似乎对jaxb是静态可见的,而d则不是
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());
}
@XmlSeeAlso({ ObjectA.class, ObjectB.class, ObjectC.class, ObjectD.class }
public class BaseSchema {}