unmarshaller marshall marshal example java xml jaxb

java - marshall - ¿Para qué necesita JAXB un constructor público sin argumentos?



object to xml java (3)

Como han señalado otros, no debería necesitarlo, pero sí (al menos en la implementación de Sun). Puedes solucionar esto con un constructor ficticio:

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

¿Para qué necesita JAXB un constructor público sin argumentos durante el cálculo?

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

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


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

Es una vergüenza de alguna manera, ya que significa que estas clases no pueden ser inmutables, pero esa es la compensación que debe hacerse.


Una implementación JAXB no debería necesitar un constructor sin argumentos durante una operación de cálculo. JAXB requiere uno para no demoler. Normalmente, la ausencia de un constructor sin argumentos provoca 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 versión futura de JAXB. En la implementación de EclipseLink de JAXB (MOXy) tenemos una solicitud de mejora abierta para esta funcionalidad (no dude en agregar detalles relevantes):

En la versión actual de JAXB puede usar un XmlAdapter para admitir este caso de uso: