为什么 JAXB 需要一个无 arg 构造函数来进行编组?
如果尝试封送一个类,该类引用没有无参数构造函数的复杂类型,例如:
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
}
使用作为 Java 一部分的 JAXB 实现,如下所示:
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 在取消编组时需要一个无 arg 构造函数 - 因为它需要实例化对象。但是,为什么 JAXB 在编组时需要一个无 arg 构造函数呢?
另外,另一个问题是,如果字段为空,为什么Java的JAXB实现会引发异常,并且无论如何都不会被编组?
我是否遗漏了一些东西,或者这些只是Java的JAXB实现中糟糕的实现选择?