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