2009-07-27 10 views
7

Tengo un xsd generado a partir de un conjunto de clases de Java existentes y actualmente deshace con éxito los mensajes XML en el objeto como se esperaba, sin embargo, lo que me gustaría hacer es dónde tengo un instancia del objeto existente tiene la unmarshaller simplemente actualizar los campos que están contenidos en el mensaje que se le pasaDesasignación de XML al objeto existente usando JAXB

por ejemplo (valga cualquier error de sintaxis aquí es sólo la parte superior de la cabeza)

Si tuviera una clase anotada Libro con numerosos campos, título, autor, publicado, etc. y el correspondiente xsd generado, muchos de los campos configurados como no obligatorios Me gustaría poder recibir la siguiente x ml

<Book> 
<title>Dummys guide to JAXB</title> 
</Book> 

en lugar de simplemente crear una nueva instancia de libro con sólo el título establecer aplicar esto a una instancia existente como una actualización, por lo que simplemente estableciendo la variable del título en esa instancia.

+0

oh sí y estoy usando JAXB en el momento de la Resolver referencia XML – robinsad

Respuesta

5

JAXB no puede hacer eso por usted, no. Sin embargo, lo que podría hacer es usar JAXB para desasignar su documento XML en un nuevo objeto, y luego copiar de manera reflexiva las propiedades del nuevo objeto en su existente.

Commons BeanUtils proporciona un mecanismo para esto, como el método BeanUtils.copyProperties. Aunque no estoy seguro si esto hace copias en profundidad.

0

Haces que esto funcione con JAXB, pero tienes que hacer la mayor parte del trabajo tú mismo.

En su ejemplo necesita una función de búsqueda, como un registro único de títulos para reservar objetos.

Como su identificador, título, es un elemento secundario, no hay garantía de que JAXB visite el elemento de título antes que cualquier otro elemento. La forma más sencilla de evitar esto es copiar las propiedades de la instancia de libro creada por Unmarshaller a su instancia de libro único. La devolución de llamada afterUnmarsal es el lugar para hacer esto:

class Book { 
// ... 
private void afterUnmarshal(Unmarshaller reader, Object parent) { 
    Book singleton = BookRegistry.getInstance().getBook(this.title); 
    if (this.publisher != null) singleton.setPublisher(this.publisher); 
    if (this.author != null) singleton.setPublisher(this.publisher); 
    // ... 
} 
} 

Si desea registrar objetos fuera del documento XML sobre la marcha, que es un poco más compleja. En su caso, probablemente desee algo como:

class Book { 
// ... 
public void setTitle(String title) { 
    this.title = title; 
    Book singleton = BookRegistry.getInstance().getBook(this.title); 
    if (singleton == null) BookRegistry.getInstance().addBook(this.title, this); 
} 
} 

que funcionará siempre que no tenga libros anidados.

Cuestiones relacionadas