I am trying to marshal an Object with an Object field (which can be numerous types of classes). I will then send the generated XML using sockets. My code is as follows;
My class to which I would like to marshall
public class Message {
private String metadata;
private Object payload;
public Message(String metadata,Object payload)
{
this.metadata=metadata;
this.payload=payload;
}
public Message() {
}
public String getMetadata() {
return metadata;
}
public void setMetadata(String metadata) {
this.metadata = metadata;
}
public Object getPayload() {
return payload;
}
public void setPayload(Object payload) {
this.payload = payload;
}
}
Snippet of how I attempt to marshall it.
private Message sendData;
...
JAXBContext jc = JAXBContext.newInstance(sendData.getClass());
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
JAXBElement<Message> rootElement = new JAXBElement<Message>(
new QName(sendData.getClass().getSimpleName()), dataClass,
sendData);
m.marshal(rootElement, stringWriter);
When I first attempted it using an ArrayLlist, I got the following error:
javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.internal.SAXException2: class java.util.ArrayList nor any of its super class is known to this context. javax.xml.bind.JAXBException: class java.util.ArrayList nor any of its super class is known to this context.]
Now I understand that it doesn't know how to parse it. Having looked and implemented an answer to this question, where you wrap the Object to a JAXBElement, I still got the above error.
Any Idea's how I can get around this? Much appreciated!