Почему JAXB не нужен конструктор без аргументов для маршалинга?

Если вы попытаетесь маршалировать класс, который ссылается на сложный тип, не имеющий конструктора без аргументов, например:

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?

45
задан bluish 4 July 2012 в 14:20
поделиться