Se si tenta di schierare una classe che fa riferimento a un tipo complesso che non ha un costruttore no-arg, come ad esempio:Perché JAXB ha bisogno di un costruttore no arg per il marshalling?
import java.sql.Date;
@XmlRootElement(name = "Foo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
int i;
Date d; //java.sql.Date does not have a no-arg constructor
}
con l'attuazione JAXB che fa parte di Java, come segue:
Foo foo = new Foo();
JAXBContext jc = JAXBContext.newInstance(Foo.class);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(foo, baos);
JAXB lancerà una
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.sql.Date does not have a no-arg default constructor
Ora, capisco perché JAXB ha bisogno di un costruttore no-arg on unmarshalling - perché ha bisogno di creare un'istanza del ob Ject. Ma perché JAXB ha bisogno di un costruttore no-arg durante il marshalling?
Inoltre, un altro pidocchio, perché l'implementazione JAXB di Java lancia un'eccezione se il campo è nullo e non verrà comunque eseguito il marshalling?
Mi manca qualcosa o sono solo delle cattive scelte di implementazione nell'implementazione JAXB di Java?
In realtà è un'implementazione errata IMHO. JAXB avrebbe dovuto fare quello che Jackson fa e offrire un'annotazione argomento costruttore: http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html. Detto questo, JAXB è ancora molto meglio di altri JSR. –