jaxbunmarshaller - parse xml java jaxb
¿Cómo puedo clonar un objeto JAXB? (6)
Tengo algunos objetos jaxb (instanciados del código generado a partir de xsd por jaxb) que necesito clonar. La clase Jaxb no parece proporcionar una interfaz para hacer esto fácilmente. No puedo editar manualmente la clase y no puedo extenderla, así que necesito crear un método de ayuda / utilidad para hacer esto. ¿Cuál es el mejor enfoque?
Dado el propósito de JAXB, creo que la forma más fácil sería ordenar su objeto a XML y deshacerlo de nuevo.
Muchas más discusiones en Google .
Las preguntas frecuentes de JAXB sugieren beanlib .
También hay un debate (así como un enlace para descargar) de un complemento clonable en jaxb2-commons, aunque no puedo encontrar ninguna referencia en la página del proyecto.
Debería probar cc-xjc , que está disponible en sourceforge. Una de sus características es generar clone () y copy-constructors.
Este es un hilo antiguo, pero también tuve que crear objetos de dominio JAXB clonables y creo que organizarlos: descalificar no es la mejor solución.
Lo ideal es que copie los objetos en la memoria utilizando métodos de clonación generados. Existe un complemento Maven ( maven-jaxb2-plugin ) que puede usar para este propósito.
Estas son las secciones relevantes en mi archivo Maven pom.xml:
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</dependency>
...
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<extension>true</extension>
<schemaDirectory>${basedir}/src/main/xsd</schemaDirectory>
<bindingDirectory>${basedir}/src/main/xjb</bindingDirectory>
<args>
<arg>-Xcopyable</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>1.11.1</version>
</plugin>
</plugins>
</configuration>
</plugin>
Tenga en cuenta el argumento -Xcopyable que genera el método de clonación dentro de todos los objetos.
Si utiliza
mvn clean install
para construir el proyecto, esto generará las clases de dominio con una implementación de clonación.
Este es un extracto de los métodos relacionados con el clon en una de las clases de dominio:
public Object clone() {
return copyTo(createNewInstance());
}
public Object copyTo(Object target) {
final CopyStrategy2 strategy = JAXBCopyStrategy.INSTANCE;
return copyTo(null, target, strategy);
}
Puede encontrar las fuentes y ejemplos del proyecto básico de jaxb2 en esta página:
https://github.com/highsource/jaxb2-basics/wiki/Sample-Projects
Las versiones con ejemplos útiles se pueden descargar desde aquí:
He realizado pruebas comparativas de varias soluciones para clonar un objeto JAXB. Aquí hay algunos resultados:
Usar el complemento xjc-clone de mofokom parece ser la solución más rápida. Simplemente permite que todos los artefactos generados implementen
Cloneable
y anula públicamenteObject.clone()
. Desafortunadamente, esto no ha llegado a Maven central (todavía).Generar artefactos
Serializable
y serializarlos / deserializarlos en un flujo ficticio es 10 veces más lento que usar los mecanismos de clonación de Java:public <T extends Serializable> T clone(T jaxbObject) { ByteArrayOutputStream out = new ByteArrayOutputStream(); ObjectOutputStream o = new ObjectOutputStream(out); o.writeObject(jaxbObject); o.flush(); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); ObjectInputStream i = new ObjectInputStream(in); return (T) i.readObject(); }
Alinear / Desasignar los objetos JAXB es 5 veces más lento que serializarlos / deserializarlos. Esto es lo que sugiere la solución de ykaganovich :
public <T extends Serializable> T clone(T jaxbObject) { StringWriter xml = new StringWriter(); JAXB.marshal(jaxbObject, xml); StringReader reader = new StringReader(xml.toString()); return JAXB.unmarshal(reader, jaxbObject.getClass()); }
Hemos utilizado el complemento jaxb2-basics: está disponible en Maven repo, agrega solo una única dependencia y también se puede usar para generar otras cosas útiles: equals, hashCode, toString, valores predeterminados, etc. Consulte este enlace para obtener más información: http : //pragmaticintegrator.wordpress.com/2012/11/20/cloning-a-jaxb-object/
Puede usar el complemento Copyable . Genera métodos de copia / clonación profundos (que pueden incluso personalizarse con estrategias).