Jeśli spróbujesz zebrać klasy, która odwołuje się typ złożony, który nie ma konstruktora nie-Arg, takich jak:Dlaczego JAXB potrzebuje konstruktora bez argumentów do zestawiania?
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
}
z realizacją JAXB, który jest częścią Java, co następuje:
Foo foo = new Foo();
JAXBContext jc = JAXBContext.newInstance(Foo.class);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(foo, baos);
JAXB rzuci
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.sql.Date does not have a no-arg default constructor
teraz rozumiem dlaczego JAXB potrzebuje żadnego-Arg konstruktora na unmarshalling - ponieważ musi instancję ob ject. Ale dlaczego JAXB potrzebuje konstruktora no-arg podczas ustawiania?
Jeszcze jedna nitka, dlaczego implementacja Java JAXB rzuca wyjątek, jeśli pole ma wartość zerową i czy i tak nie zostanie ono wysłane?
Czy brakuje mi czegoś lub czy są to tylko złe wybory wdrożeniowe w implementacji Java JAXB?
To faktycznie złe wdrożenie IMHO. JAXB powinien był zrobić to, co robi Jackson i podać adnotację do argumentu konstruktora: http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html. Biorąc to pod uwagę, JAXB jest nadal dużo lepszy od innych JSR. –