2012-03-14 129 views
0

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

JAXB将在它们上使用@XmlAnyElement注释生成任何属性。由于我们使用自己的流实现,所以我们需要避免JAXB生成任何属性。但是,因为看起来不可能告诉JAXB绑定忽略xs:任何元素。

在我目前关于这个主题的研究中,我发现,可以编写一个DomHandler,它将被使用。现在,如果这DomHandler应该是这样的:

StreamHandler implements DomHandler<MyStream, StreamResult> 

,我们可以利用这个DomHandler做的工作,而不需要到流逻辑旁边添加了生成类。现在我们可以重新使用生成的任何属性。

如下

@XmlAnyElement(StreamHandler.class) 

的DomHandler应设置但是,我怎么能在JAXB绑定XJB-文件中生成@XmlAnyElement注释使用此DomHandler定义?

编辑:

我提起这个request并实施了JAXB Maven的插件插件来解决这个问题。我可能会要求将此插件添加到基本插件包中。

回答

0

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

你真正想要的是让XJC在绑定时“忽略”一些属性。我认为目前不可能,但可以通过JAXB插件解决。请file a request

现在,回到你的方法和你的问题。没有“原生”自定义来自定义@XmlAnyElement的DOM处理程序,但是您可以使用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> 

你可以做同样的事情@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> 
+0

谢谢您的答复。您的提案存在的问题是,使用StreamHandler实现DomHandler 还需要更改属性的类型。现在任何属性的类型都是T1。 getter和setter方法的签名也应该进行调整,并且注释插件不能完成这项工作。 – user498380 2012-03-15 11:41:38