为什么JAXB在进行编组时需要一个无参构造函数?
- 论坛
- 为什么JAXB在进行编组时需要一个无参构造函数?
7 浏览
为什么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实现中的糟糕选择?