2012-09-05 25 views
5

En la referencia, la implementación de JAXB está ahí para que XmlSeeAlso use el nombre = valor de XmlRootElement?Nombres XmlSeeAlso y XmlRootElement?

El efecto que deseo es que el atributo de tipo use el nombre = valor en lugar del nombre de la clase real de XmlSeeAlso.

¿Es posible esto alguna otra implementación de JAXB?

pequeño ejemplo:

@XmlRootElement(name="some_item") 
public class SomeItem{...} 

@XmlSeeAlso({SomeItem.class}) 
public class Resource {...} 

XML: 
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"> 
... 
</resource> 

posible sin mucho esfuerzo?

Respuesta

11

Sobre @XmlSeeAlso

El propósito de la @XmlSeeAlso anotación es sólo para dejar que su JAXB (JSR-222) aplicación sabe que cuando está procesando los metadatos para Resource que también debe procesar los metadatos para el SomeItem clase. Algunas personas creen erróneamente que está relacionado con la herencia del mapeo, ya que ese es el caso de uso con el que más se usa. Como las subclases de una clase no pueden determinarse utilizando la reflexión de Java, se usa @XmlSeeAlso para informar a la implementación de JAXB que también se deben crear asignaciones para las subclases.


A continuación se muestra un ejemplo de cómo se puede apoyar su caso de uso:

Recursos

El nombre de tipo complejo correspondiente a una clase Java se suministra a través de la @XmlType anotación.

package forum12288631; 

import javax.xml.bind.annotation.XmlType; 

@XmlType(name="some_item") 
public class Resource { 

} 

Demostración nombre de elemento

La raíz puede venir de la @XmlRootElement anotación o puede ser suministrado a través de una instancia de JAXBElement. Crearemos una instancia de JAXBElement e indicaremos que se está reteniendo en una instancia de Object. Cuando se combina esto, el atributo xsi:type se incluirá en la salida.

package forum12288631; 

import javax.xml.bind.*; 
import javax.xml.namespace.QName; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Resource.class); 

     Resource resource = new Resource(); 
     JAXBElement<Object> jaxbElement = new JAXBElement<Object>(QName.valueOf("resource"), Object.class, resource); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(jaxbElement, System.out); 
    } 

} 

salida

El XML resultante tiene el elemento raíz suministrada por el JAXBElement y el valor del atributo xsi:type proviene de la @XmlType anotación en Resource.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"/> 
Cuestiones relacionadas