JAXB 需要一个公共的 no-arg 构造函数做什么?

2022-09-02 10:34:24

在编组期间,JAXB 需要一个公共无 arg 构造函数做什么?

 Marshaller msh = ctx.createMarshaller();
 msh.marshal(object, System.out);

我正在传递一个对象,而不是一个类。为什么 JAXB 需要构造函数?要构造什么?


答案 1

JAXB 实现在封送操作期间不需要无参数构造函数。JAXB确实需要一个用于取消编组。通常,缺少无参数构造函数会导致在创建 JAXBContext 时出错。您正在使用的 JAXB 实现可能会延迟初始化,直到执行实际操作。

一般来说,对多参数构造函数的支持是我们应该在 JAXB 的未来版本中考虑的问题。在JAXB(MOXy)的EclipseLink实现中,我们有一个针对此功能的增强请求(随意添加相关详细信息):

在当前版本的 JAXB 中,您可以使用 XmlAdapter 来支持此用例:


答案 2

正如其他人所指出的那样,它不应该真正需要一个,但(至少在Sun的实现中)它确实如此。您可以使用虚拟构造函数来解决此问题:

private MyObject() {
    throw new UnsupportedOperationException("No-arg constructor is just to keep JAXB from complaining");
}

推荐