0

我一直在寻找一种方法来更改 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-plugin 插件来解决这个问题。我可能会要求将此插件添加到 basics-addon 捆绑包中。

4

1 回答 1

0

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

您真正想要的是让 XJC 在绑定时“忽略”某些属性。我认为目前不可能,但可以使用 JAXB 插件解决。请提出请求

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

https://svn.java.net/svn/jaxb2-commons~svn/basics/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>

你可以用@XmlAnyElementwll 做同样的事情:

<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>
于 2012-03-15T09:44:02.193 回答