【发布时间】:2012-03-05 07:13:05
【问题描述】:
如果您尝试编组一个引用了没有无参数构造函数的复杂类型的类,例如:
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 在解组时需要一个无参数构造函数——因为它需要实例化对象。但是为什么 JAXB 在编组时需要一个无参数的构造函数呢?
另外,另一个傻瓜,如果字段为空,为什么 Java 的 JAXB 实现会抛出异常,并且无论如何都不会被编组?
我是否遗漏了什么,或者这些只是 Java 的 JAXB 实现中的错误实现选择?
【问题讨论】:
-
它实际上是恕我直言错误的实施。 JAXB 应该完成 Jackson 所做的事情并提供构造函数参数注释:cowtowncoder.com/blog/archives/2011/07/entry_457.html。话虽如此,JAXB 仍然比其他 JSR 好得多。
标签: java xml jaxb marshalling