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

时间:2010-02-15 22:49:05

标签: java jaxb

我正在尝试编组一个将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或其任何超类都是这个上下文所知的。”就是我得到的。

有没有解决此错误的方法?

2 个答案:

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