2010-11-11 21 views
15

¿Para qué necesita JAXB un constructor público no-arg durante el marshalling?¿Para qué JAXB necesita un constructor público no-arg?

Marshaller msh = ctx.createMarshaller(); 
msh.marshal(object, System.out); 

Estoy pasando de un objeto, no de una clase. ¿Por qué JAXB necesita un constructor? Para construir qué?

+0

Nitpick: Estoy bastante seguro de que no necesita un constructor * public * no-arg. Solo necesita * cualquier * constructor no-arg. Se puede proteger/privado/paquete privado si lo desea. – MatrixFrog

Respuesta

6

Una implementación JAXB no debería necesitar un constructor no-arg durante una operación Marshal. JAXB requiere uno para descalificar. Normalmente, la ausencia de un constructor no-arg causa un error cuando se crea el JAXBContext. La implementación de JAXB que está utilizando puede retrasar la inicialización hasta que se realice una operación real.

En general, el soporte para constructores multi-arg es algo que deberíamos considerar en una futura versión de JAXB. En el EclipseLink implementation of JAXB (MOXy) tenemos una solicitud de mejora abierto para esta funcionalidad (no dude en añadir detalles relevantes):

En la versión actual de JAXB Se podría utilizar un XmlAdapter a este caso de uso:

+0

Con 'XmlAdapter' tengo que conocer la estructura interna de la clase que se clasifica. En este caso, ¿por qué no puedo simplemente agregar un constructor no-arg? – yegor256

+2

@Vincenzo definitivamente podrías agregar un constructor sin argumentos. Si por alguna razón no pudiera modificar sus clases de modelo, se podría usar un XmlAdapter. –

4

Lo mismo que muchos marcos: simplicidad y consistencia. Permite a la biblioteca llamar simplemente al Class.newInstance() sin tener que preocuparse acerca de cómo especificar ciertas dependencias para un constructor que las tome. JAXB no quiere preocuparse por la Inyección de Dependencias completa más allá de la configuración basada en atributos que ya tiene.

Es una pena en cierto modo, ya que significa que estas clases no pueden ser inmutables, pero esa es la desventaja que hay que hacer.

+0

Siempre y cuando no especifique qué parámetro está en el constructor, no veo ninguna forma de que JAXB lo descubra. La API de reflexión proporciona solo los tipos, sin nombres para los argumentos para el constructor. ¿Cómo debería saber que el primer parámetro (String) es el nombre y no un ID o sthg así? – ZeissS

+1

Corrección a mí mismo: la anotación podría resolver esto ... – ZeissS

+3

Sé para qué sirve un constructor público no-arg, pero ¿por qué JAXB lo necesita durante el cálculo? Estoy pasando una instancia a 'mariscal()', no a una clase. – yegor256

5

Como otros han señalado, debe realmente no necesita más que (al menos en la implementación de Sun) lo hace. Puede solucionar esto con un constructor simulado:

private MyObject() { 
    throw new UnsupportedOperationException("No-arg constructor is just to keep JAXB from complaining"); 
} 
+0

No se puede lanzar una excepción aquí, JAXB realmente usa este c-tor – Derp

+0

Eso depende de si JAXB está construyendo el objeto o si ([como los comentarios OP] (http://stackoverflow.com/questions/4155361/what- jaxb-needs-a-public-no-arg-constructor-for/12921496? noredirect = 1 # comment4484733_4155388)) lo está construyendo usted mismo y está pasando una instancia a 'mariscal()'. –

Cuestiones relacionadas