JAXB使用java.lang.Object字段编组对象

我正在尝试编组一个对象作为其字段之一的对象。

@XmlRootElement public class TaskInstance implements Serializable { ... private Object dataObject; ... } 

dataObject可以是许多不同类型的未知类型之一,因此指定每个地方不仅不切实际而且不可能。 当我试图封送该对象时,它表示该类不为上下文所知。

 MockProcessData mpd = new MockProcessData(); TaskInstance ti = new TaskInstance(); ti.setDataObject(mpd); String ti_m = JAXBMarshall.marshall(ti); 

“MockProcessData及其任何超类都不为此所知。” 就是我得到的。

有没有解决这个错误的方法?

JAXB无法封送任何旧对象,因为它不知道如何。 例如,它不知道要使用的元素名称。

如果需要处理这种通配符,唯一的解决方案是将对象包装在JAXBElement对象中,该对象包含足以让JAXB编组为XML的信息。

尝试以下方法:

 QName elementName = new QName(...); // supply element name here JAXBElement jaxbElement = new JAXBElement(elementName, mpd.getClass(), mpd); ti.setDataObject(jaxbElement); 

方法:

 public String marshallXML(Object object) { JAXBContext context; try { context = JAXBContext.newInstance(object.getClass()); StringWriter writer = new StringWriter(); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(object, writer); String stringXML = writer.toString(); return stringXML; } catch (JAXBException e) { } } 

模型:

 import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Customer { String name; int id; public String getName() { return name; } @XmlElement public void setName(String name) { this.name = name; } public int getId() { return id; } @XmlAttribute public void setId(int id) { this.id = id; } }