我正在尝试编组一个将Object作为其字段之一的对象。
@XmlRootElement
public class TaskInstance implements Serializable {
...
private Object dataObject;
...
}
dataObject可以是许多不同 unknown 类型中的一种,因此在某处指定每个类型不仅不切实际,而且不可能。当我尝试编组对象时,它表示该类不为上下文所知。
MockProcessData mpd = new MockProcessData();
TaskInstance ti = new TaskInstance();
ti.setDataObject(mpd);
String ti_m = JAXBMarshall.marshall(ti);
“MockProcessData或其任何超类都是这个上下文所知的。”就是我得到的。
有没有解决此错误的方法?
答案 0 :(得分:7)
JAXB无法封送任何旧对象,因为它不知道如何。例如,它不知道要使用的元素名称。
如果需要处理这种通配符,唯一的解决方案是将对象包装在JAXBElement
对象中,该对象包含足以让JAXB编组为XML的信息。
尝试类似:
QName elementName = new QName(...); // supply element name here
JAXBElement jaxbElement = new JAXBElement(elementName, mpd.getClass(), mpd);
ti.setDataObject(jaxbElement);
答案 1 :(得分:0)
方法:
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;
}
}