Nếu bạn cố gắng sắp xếp một lớp học có sự tham khảo một loại phức tạp mà không có một constructor không có arg, chẳng hạn như:Tại sao JAXB lại cần một hàm tạo arg cho việc sắp xếp lại?
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
}
với việc thực hiện JAXB là một phần của Java, như sau:
Foo foo = new Foo();
JAXBContext jc = JAXBContext.newInstance(Foo.class);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(foo, baos);
JAXB sẽ ném một
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions java.sql.Date does not have a no-arg default constructor
Bây giờ, tôi hiểu tại sao JAXB cần một không-arg constructor trên unmarshalling - bởi vì nó cần phải nhanh chóng ob ject. Nhưng tại sao JAXB cần một constructor no-arg trong khi marshalling?
Ngoài ra, một nit khác, tại sao việc triển khai JAXB của Java lại ném một ngoại lệ nếu trường đó là null và sẽ không được sắp xếp lại?
Tôi có thiếu thứ gì đó hoặc chỉ là những lựa chọn thực hiện không tốt trong triển khai JAXB của Java không?
Thực thi IMHO thực sự kém của nó. JAXB nên đã làm những gì Jackson làm và đưa ra một chú giải đối số hàm tạo: http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html. Điều đó đang được nói JAXB vẫn còn tốt hơn nhiều so với các JSR khác. –