2010-03-30 21 views
5

Necesito ayuda con respecto al siguiente problema con JAXB 2.1.JAXB: @XmlTransient en super clase de terceros o externa

Ejemplo: He creado una clase SpecialPerson que amplía una clase abstracta Persona. Ahora quiero transformar mi estructura de objetos en un esquema XML usando JAXB. Por lo tanto, no quiero que el tipo de persona XML aparezca en mi esquema XML para mantener el esquema simple. En su lugar, quiero que los campos de la clase Person aparezcan en el tipo XML de SpecialPerson.

Normalmente agregaría la anotación @XmlTransient en el nivel de clase en el código de persona.

El problema es que Person es una clase de terceros y no tengo posibilidad de agregar @XmlTransient aquí. ¿Cómo puedo decirle a JAXB que debe ignorar la clase Person sin anotar la clase? ¿Es posible configurar esto externamente de alguna manera?

¿Ha tenido el mismo problema antes? ¿Alguna idea de cuál sería la mejor solución para este problema?

Respuesta

2

Puede proporcionar asignaciones para clases de terceros utilizando Annox.

+0

(+1) buen consejo; Tomaré uno de esos, gracias – skaffman

+0

BTW, soy el autor. – lexicore

+0

Ah, * ese * lexi :) – skaffman

0

Puede anotar su clase SuperPerson con @XmlTransient, que le indicará a JaxB que no margine automáticamente todas las propiedades. Y luego anote cada getter (o campo) que desee serializar con la anotación relevante.

Este enfoque no es muy elegante, pero debería funcionar

+0

Supongo que querías decir SpecialPerson y no SuperPerson, ¿verdad? El problema es que no puedo anotar el getter y los campos tal como están definidos en la clase Person (la superclase) y no en la subclase SpecialPerson. – Phil

+0

Sí, quise decir SpecialPerson ... de todos modos, puedes anular el getter \ setters agregar anotaciones en los métodos de anulación y simplemente llamar a super ... como dije, no muy elegante, pero debería funcionar :-) – LiorH

1

El EclipseLink JAXB (moxy) aplicación ofrece un medio de representar los metadatos como XML que se puede utilizar:

Puede especificar algunos de los metadatos usando anotaciones, y el resto como XML. A continuación se muestra lo que el documento se vería así:

< xml-fijaciones xmlns = "http://www.eclipse.org/eclipselink/xsds/persistence/oxm">

        < java -Tipos>

                < java de tipo name = "Persona" xml-transitoria = "true" />

        </java-types>

</xml-bindings>

3

OK, esto era un dolor en el ya-sabes-qué. Finalmente, después de tamizar a través de muchos a publicaciones en blogs, esto es lo que hice,

añade una clase package-info.java en el paquete de 'clase de terceros' como éste,

@ javax.xml.bind. annotation.XmlAccessorType (javax.xml.bind.annotation.XmlAccessType.NINGUNO) paquete paquete de terceros;

En mi caso, era solo un paquete, así que fue fácil. Obviamente, tendrá que hacer esto para cada estructura de paquete por separado. No he intentado hacerlo a nivel de paquete maestro.

+0

Bien, ¿alguien puede por favor da un ejemplo para esta solución? No parece estar funcionando para mí. La extensión de clase observable y observable aparece en xsd generado. Entonces qué hago ? Cree un paquete java.util y ponga la clase package-info.java con la anotación? – Bren

+0

Sí - eso es correcto. – nevster

Cuestiones relacionadas