首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAXB生成的No @XmlRootElement

JAXB生成的No @XmlRootElement
EN

Stack Overflow用户
提问于 2009-05-04 11:32:19
回答 16查看 293.3K关注 0票数 240

我正在尝试从FpML (Finanial Products Markup Language)版本4.5生成Java类。生成了大量的代码,但我不能使用它。为了序列化一个简单的文档,我得到了以下内容:

代码语言:javascript
复制
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 (JAXB2.1)指向fpml 4-5.xsd,然后包含所有类型。

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2010-01-31 19:15:06

为了将其他人已经声明或暗示的内容结合起来,JAXB决定是否将@XmlRootElement注释放在生成的类上的规则是非常重要的(见本文)。

@XmlRootElement之所以存在,是因为JAXB运行时需要某些信息才能封送/解除封送给定对象,特别是XML元素名称和命名空间。你不能就这样把任何旧的东西传给元帅。@XmlRootElement提供了这些信息。

然而,注释只是一种方便- JAXB并不需要它。替代方法是使用JAXBElement包装器对象,这些对象提供与@XmlRootElement相同的信息,但以对象的形式提供,而不是注释。

但是,JAXBElement对象的构造很麻烦,因为您需要知道XML和名称空间,而业务逻辑通常不知道它们。

值得庆幸的是,当XJC生成一个类模型时,它还生成一个名为ObjectFactory的类。这在一定程度上是为了向后兼容JAXB v1,但也是XJC将生成的工厂方法放置在自己的对象周围创建JAXBElement包装器的地方。它为您处理XML名称和命名空间,因此您不需要担心它。您只需查看ObjectFactory方法(对于大型模式,可以有数百个方法)就可以找到所需的方法。

票数 285
EN

Stack Overflow用户

发布于 2011-05-03 13:18:29

在上面已经链接的博客文章的底部已经提到了这一点,但是这对我来说是一种享受:

代码语言:javascript
复制
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(new JAXBElement<MyClass>(new QName("uri","local"), MyClass.class, myClassInstance), System.out);
票数 74
EN

Stack Overflow用户

发布于 2013-02-27 16:27:01

正如上述答案中所暗示的那样,如果在XSD中将其类型定义为命名类型,则不会在根元素上获得XMLRootElement,因为该命名类型可以在XSD的其他地方使用。尝试将其混合为匿名类型,即:

代码语言:javascript
复制
<xsd:element name="myRootElement" type="MyRootElementType" />

<xsd:complexType name="MyRootElementType">
...
</xsd:complexType>

你可能会:

代码语言:javascript
复制
<xsd:element name="myRootElement">
    <xsd:complexType>
    ...
    <xsd:complexType>
</xsd:element>
票数 61
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/819720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档