JAXB如何定义要在@XmlAnyElement中使用的DomHandler



我一直在寻找一种方法来更改xs:any元素的JAXB行为,因为我们使用的是流而不是DOM。我们需要能够处理巨大(千兆字节)的数据文件/流。

JAXB将使用@XmlAnyElement注释生成任意属性。由于我们使用自己的流实现,所以我们需要避免JAXB生成任何属性。然而,似乎不可能告诉JAXB绑定忽略xs:any元素。

在我目前对这个主题的研究中,我发现可以编写一个DomHandler,它将被使用。现在,如果这个DomHandler看起来像这样:

StreamHandler implements DomHandler<MyStream, StreamResult>

我们可以使用这个DomHandler来完成这项工作,而不需要在生成的类旁边添加流逻辑。现在我们可以重用生成的任意属性。

DomHandler应设置如下

@XmlAnyElement(StreamHandler.class)

但是,我如何在jaxb绑定xjb文件中定义在生成的@XmlAnyElement注释中使用此DomHandler?

编辑:

我提交了这个请求,并实现了JAXB maven插件插件插件来解决这个问题。我可能会请求将这个插件添加到基础插件捆绑包中。

我不确定这是否真的是解决问题的正确方法。

您实际想要的是让XJC在绑定时"忽略"某些属性。我认为目前这是不可能的,但它可以通过JAXB插件来解决。请提交请求。

现在,回到你的方法和问题上来。没有"本机"自定义来自定义@XmlAnyElement的DOM处理程序,但您可以使用Annotate插件在生成的类中添加/修改任意注释。以下是一个演示此功能的测试项目:

https://svn.java.net/svn/jaxb2-commons~svn/basis/trunk/tests/annotate/

也就是说,这种定制将required = true添加到生成的@XmlAttribute注释中:

<jaxb:bindings node="xs:complexType[@name='issueJIIB39CType']/xs:attribute[@name='test']">
    <annox:annotate target="field">
        <annox:annotate
            annox:class="javax.xml.bind.annotation.XmlAttribute"
            required="false"/>
    </annox:annotate>
</jaxb:bindings>

你可以用@XmlAnyElement做同样的事情,就像:

<jaxb:bindings node="...">
    <annox:annotate target="field">
        <annox:annotate
            annox:class="javax.xml.bind.annotation.XmlAnyElement"
            value="com.acme.foo.StreamHandler"/>
    </annox:annotate>
</jaxb:bindings>

相关内容

  • 没有找到相关文章

最新更新