我一直在寻找一种方法来更改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>