jaxbunmarshaller - parse xml java jaxb
JAXB Marshalling Objects con el campo java.lang.Object (2)
Estoy intentando ordenar un objeto que tiene un Objeto como uno de sus campos.
@XmlRootElement
public class TaskInstance implements Serializable {
...
private Object dataObject;
...
}
DataObject puede ser uno de los muchos tipos desconocidos diferentes, por lo que especificarlos en alguna parte no solo es impráctico sino también imposible. Cuando trato de ordenar el objeto, dice que el contexto no conoce la clase.
MockProcessData mpd = new MockProcessData();
TaskInstance ti = new TaskInstance();
ti.setDataObject(mpd);
String ti_m = JAXBMarshall.marshall(ti);
"MockProcessData ni ninguna de sus superclase se conoce en este contexto". es lo que obtengo
¿Hay alguna forma de evitar este error?
JAXB no puede ordenar ningún objeto viejo, ya que no sabe cómo hacerlo. Por ejemplo, no sabría qué nombre de elemento usar.
Si necesita manejar este tipo de comodín, la única solución es envolver los objetos en un objeto JAXBElement
, que contiene suficiente información para que JAXB marque en XML.
Pruebe algo como:
QName elementName = new QName(...); // supply element name here
JAXBElement jaxbElement = new JAXBElement(elementName, mpd.getClass(), mpd);
ti.setDataObject(jaxbElement);
Método:
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) {
}
}
Modelo:
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;
}
}