我正在尝试从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,其中包括所有类型。
v
为了将其他人已经声明或暗示的内容结合在一起,JAXB XJC决定是否将@XmlRootElement注释放在生成的类上的规则并不容易(请参见本文)。
@XmlRootElement
@XmlRootElement之所以会存在,是因为JAXB运行时需要某些信息才能封送/取消封送给定的对象,特别是XML元素名称和名称空间。你不能仅将任何旧对象传递给Marshaller。@XmlRootElement提供此信息。
Marshaller
注释只是一种方便,但是-JAXB不需要它。替代方法是使用JAXBElement包装器对象,该对象提供与相同的信息@XmlRootElement,但以对象的形式而不是注释的形式。
JAXBElement
但是,JAXBElement对象的构造很麻烦,因为你需要知道XML元素名称和名称空间,而业务逻辑通常不知道。
幸运的是,当XJC生成类模型时,它还生成了一个名为的类ObjectFactory。这样做的部分原因是为了与JAXB v1向后兼容,但是XJC还是在这里放置了生成的工厂方法,这些方法JAXBElement围绕你自己的对象创建包装器。它为你处理XML名称和名称空间,因此你无需担心。你只需要查看这些ObjectFactory方法(对于大型模式,可能有数百种方法)来找到所需的方法。
ObjectFactory