为什么JAXB在进行编组时需要一个无参构造函数?

7 浏览
0 Comments

为什么JAXB在进行编组时需要一个无参构造函数?

如果你试图驱动一个引用了没有无参构造函数的复杂类型的类,例如:

import java.sql.Date;
@XmlRootElement(name = "Foo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
    int i;
    Date d; //java.sql.Date没有无参构造函数
}

使用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在解组时为什么需要一个无参构造函数 - 因为它需要实例化对象。但是为什么JAXB在组装时需要一个无参构造函数呢?

另外,还有一个小问题,为什么Java的JAXB实现会在字段为空时抛出异常,而它实际上不会被组装?

我是不是漏掉了什么,还是这些只是Java的JAXB实现中的糟糕选择?

0