Nota: Soy el líder EclipseLink JAXB (MOXy) y miembro de JAXB 2 (JSR-222) grupo de expertos.
hay un par de aspectos interesantes de su caso de uso:
- ArrayList como el objeto raíz
- relación bidireccional entre
ObjReal
y ObjStruc
1. arrayList AS objeto raíz
Implementaciones JAXB (MOXy, Metro, Ja xMe, etc.) no proporcionan soporte directo para manejar tipos Collection
como objetos raíz. Para manejar este caso de uso, simplemente necesita crear una clase contenedora que tenga el Collection
deseado como un campo/propiedad.
@XmlRootElement(name="root-element-name")
@XmlAccessorType(XmlAccessType.FIELD)
public class ListWrapper {
private ArrayList<ObjReal> objReals;
}
2. BIDIRECCIONAL RELATIOSNHIP
Usted puede usar la extensión @XmlInverseReference
en la implementación de EclipseLink JAXB para manejar la relación bidireccional en su modelo. A continuación he incluido un ejemplo completo. He omitido la mayoría de los métodos de acceso para ahorrar espacio.
ObjReal
import java.util.ArrayList;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class ObjReal {
private String id;
private String data;
ArrayList<ObjStruc> objStrucs=new ArrayList<ObjStruc>();
public ArrayList<ObjStruc> getObjStrucs() {
return objStrucs;
}
}
ObjStruc
La anotación @XmlInverseReference
se utiliza en esta clase. En esta anotación se especifica el nombre cado/Propiedad en el otro sentido de la relación:
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;
@XmlAccessorType(XmlAccessType.FIELD)
class ObjStruc {
@XmlInverseReference(mappedBy="objStrucs")
private ObjReal objReal;
public ObjReal getObjReal() {
return objReal;
}
}
jaxb.properties
Para especificar moxy como su proveedor de JAXB es necesario incluir un archivo llamado jaxb .properties con el siguiente contenido en el mismo paquete que sus clases de dominio:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
demostración
puede ejecutar el siguiente código para verificar la correspondencia:
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(ObjReal.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum8868303/input.xml");
ObjReal objReal = (ObjReal) unmarshaller.unmarshal(xml);
for(ObjStruc objStruc : objReal.getObjStrucs()) {
System.out.println(objStruc.getObjReal());
}
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(objReal, System.out);
}
}
de entrada (input.xml)
<?xml version="1.0" encoding="UTF-8"?>
<objReal>
<id>123</id>
<data>some data</data>
<objStrucs/>
<objStrucs/>
</objReal>
salida
A continuación se muestra la salida de ejecutando el código de demostración. Como se puede ver la propiedad objReal
en cada uno de los ObjStruc
objetos fue poblada durante el unmarshal:
[email protected]
[email protected]
<?xml version="1.0" encoding="UTF-8"?>
<objReal>
<id>123</id>
<data>some data</data>
<objStrucs/>
<objStrucs/>
</objReal>
Para más información
Descargar EclipseLink
Puede descargar EclipseLink en:
Muy interesante ... ¡Voy a votar esto! – aviad