JAXB Разметка объектов с полем java.lang.Object - PullRequest
9 голосов
/ 16 февраля 2010

Я пытаюсь упорядочить объект, у которого в качестве одного из полей указан объект.

@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, ни какой-либо из его суперклассов не известен этому контексту." это то, что я получаю.

Есть ли способ обойти эту ошибку?

Ответы [ 2 ]

7 голосов
/ 16 февраля 2010

JAXB не может маршалировать любые старые объекты, так как не знает как.Например, он не будет знать, какое имя элемента использовать.

Если вам нужно обработать этот тип подстановочных знаков, единственное решение - это обернуть объекты в объект JAXBElement, который содержит достаточно информации дляJAXB маршал в XML.

Попробуйте что-то вроде:

QName elementName = new QName(...); // supply element name here
JAXBElement jaxbElement = new JAXBElement(elementName, mpd.getClass(), mpd);
ti.setDataObject(jaxbElement);
0 голосов
/ 20 мая 2013

Метод:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...