Если вы попытаетесь маршалировать класс, который ссылается на сложный тип, не имеющий конструктора без аргументов, например:
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
}
, с реализацией JAXB, которая является частью Java, как следует:
Foo foo = new Foo();
JAXBContext jc = JAXBContext.newInstance(Foo.class);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(foo, baos);
JAXB выдаст
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.sql.Date does not have a no-arg default constructor
Теперь я понимаю, почему JAXB нужен конструктор без аргументов при демаршалинге - потому что он должен создать экземпляр объекта. Но почему JAXB нуждается в конструкторе без аргументов при маршалинге?
Кроме того, еще один придурок: почему реализация JAXB в Java выдает исключение, если поле имеет значение NULL и в любом случае не будет упорядочиваться?
Я что-то упускаю или это просто неудачный выбор реализации в реализации JAXB в Java?