没有@XmlRootElement由JAXB生成

问题:

我正在尝试从FpML(金融产品标记语言)版本4.5生成Java类。生成一吨代码,但是我不能使用它。尝试序列化一个简单的文档我得到:

javax.xml.bind.MarshalException
  - with linked exception: [com.sun.istack.SAXException2: unable
  to marshal type
  "org.fpml._2008.fpml_4_5.PositionReport"
  as an element because it is missing an
  @XmlRootElement annotation]

事实上,没有类有@XmlRootElement注解,所以我可以做错什么?我指向xjc(JAXB 2.1)到fpml-main-4-5.xsd,然后包括所有类型。

回答:

为了结合其他人已经表示或暗示的内容,JAXB XJC决定是否将@XmlRootElement注释放在生成的类上的规则是非常简单的(see this article)。
 @XmlRootElement存在,因为JAXB运行时需要某些信息才能组织/解组给定对象,特别是XML元素名称和命名空间。你不能把任何旧对象传给马歇尔。 @XmlRootElement提供此信息。
注释只是一个方便,但JAXB不需要它。替代方法是使用JAXBElement包装器对象,它们提供与@XmlRootElement相同的信息,但以对象的形式而不是注释。
但是,JAXBElement对象很难构造,因为您需要知道XML元素名称和命名空间,哪些业务逻辑通常不会。
幸运的是,当XJC生成一个类模型时,它也会生成一个名为ObjectFactory的类。这部分是与JAXB v1的向后兼容性,但它也是XJC放置生成的工厂方法的一个地方,它们在您自己的对象周围创建JAXBElement包装器。它为您处理XML名称和命名空间,因此您不需要担心。您只需要查看ObjectFactory方法(对于大型模式,可以有数百种)来查找所需的方法。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: No @XmlRootElement generated by JAXB

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

20 − = 14