2009-03-18 13 views
10

Tengo una clase anotada como @XmlRootElement con @XmlAccessorType(XmlAccessType.NONE). El problema que estoy teniendo es que los métodos de la superclase están siendo atados, cuando no quiero que estén vinculados, y no puedo actualizar la clase. Espero que haya una anotación que pueda poner en la clase del elemento raíz para evitar que esto suceda.¿Cómo evito que JAXB vincule los métodos de superclase de @XmlRootElement al coordinar?

Ejemplo:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.NONE) 
public class Person extends NamedObject { 

    @XmlElement 
    public String getId() { ... } 

} 

yo esperaría que sólo los métodos anotados en @XmlElementPerson estarían obligados y marshalled, pero los métodos de la superclase están siendo obligados, también. El XML resultante tiene demasiada información.

¿Cómo evito que los métodos de la superclase se vinculen sin tener que anotar la propia superclase?

Respuesta

6

De acuerdo con este post StackOverflow: How can I ignore a superclass?

No es posible con JAX-B de ignorar la superclase sin modificar la superclase. Citando la parte pertinente de dicho mensaje:

Update2: He encontrado a thread on java.net para un problema similar. Ese hilo dio como resultado un enhancement request, que se marcó como un duplicado de another issue, lo que dio como resultado la anotación @XmlTransient. Los comentarios en estos informes de errores me llevan a creen que esto es imposible en la especificación actual .

+0

¿Puede proporcionar un enlace a ese hilo en java.net? – Matt

+0

Se agregaron enlaces de la parte citada del problema de SO mencionado. – benvolioT

5

Sólo añadir

@XmlAccessorType(XmlAccessType.NONE) 

delante de cada declaración superclase (y la propia clase).

En su caso:

@XmlAccessorType(XmlAccessType.NONE) 
class NamedObject{ 
    [ ... ] 
} 

Recuerde que esto no tiene que ser hecho realmente para cada superclase, a menudo es olvidado cuando se trata de enormes árboles de dependencias clase.

Las interfaces, por supuesto, no necesitan ninguna anotación JAXB.

+0

Quería evitar tener que entrar en las superclases, pero también he llegado a esta conclusión. Gracias por la respuesta. – Matt

1

Me enfrento al mismo problema. Mi superclase no maneja ninguna anotación JAXB (no tiene que ser así) y me gustaría que mi subclase no incluyera propiedades de superclase durante la clasificación.

Agregar el XmlAccesorType en la superclase no puede ser la solución ya que no tengo forma de modificar la superclase.

¿Hay alguna otra solución?

+1

¿Has encontrado algo al respecto? – Matt

+0

Anular la propiedad y agregarle la anotación '@ XMLTransient'. – HDave

3

Sé que esta pregunta es bastante antigua, pero hay un tipo de solución que funciona si su superclase está en el mismo paquete que su hijo.

Crear una package-info.java en su embalaje e introducirla

@XmlAccessorType(XmlAccessType.NONE) 
package my.package.with.classes; 

Obviamente, se establece XmlAccessType.NONE a todas las clases del paquete. Yo mismo lo uso en cada paquete de nuestro modelo de dominio. Por lo tanto, estoy bastante seguro. Sin embargo, si su clase está "fuera de alcance", es decir, está en el JDK, use la solución de la respuesta aceptada en [JAX-B] How can I ignore a superclass?.

Espero que sea útil para cualquiera que tropiece con esta pregunta como yo lo hice.

0

Reemplace su implementación JAX-B con MOXy y puede hacer lo que desee. Tiene un montón de extensiones que van más allá de la JAX-B normal, una de las cuales le permitirá ignorar las propiedades heredadas, etc. También admite mover las anotaciones JAX-B a un archivo de mapeo XML para que pueda mantener múltiples conjuntos de mapeos .

Cuestiones relacionadas