将JAXB绑定代码段导入其他绑定文件

时间:2016-03-18 14:44:29

标签: java xml jaxb xjc maven-jaxb2-plugin

对于某个xsd文件,我创建了一个相应的绑定文件来执行某些操作。在我的例子中,用注释注释ComplexTypes。使用XPath表达式查找类型。以下示例演示了这一点:

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" 
    version="2.1" 
    xmlns:annox="http://annox.dev.java.net" jaxb:extensionBindingPrefixes="annox">

    <jaxb:bindings schemaLocation="FirstSchema.xsd" node="/xsd:schema">

        <jaxb:bindings node="//xsd:complexType//xsd:element[contains(@type, 'SomeType')]" required="false">
            <annox:annotate target="field">@com.example.Type(type = "SomeType")</annox:annotate>
        </jaxb:bindings>

        //About 100 lines of bindings
    </jaxb:bindings>

</jaxb:bindings>

定义的绑定比仅显示的单个绑定更多,但我的问题是绑定现在在FirstSchema.xsd上执行。我有很多其他xsd文件需要完全相同的绑定。如果我有超过10个xsd个文件,我每次都必须为每个模式复制粘贴这些绑定。

是否有可能提取&#34;绑定并重新使用它们为每个其他xsd文件,如导入?它与this comment/question有关。建议的解决方案是使用jaxb:schemaBindings/jaxb:package,但如果我理解正确,下面的代码片段只是将类生成到另一个包中并且没有真正解决问题?

<jaxb:schemaBindings>
    <jaxb:package name="com.example.package"/>
</jaxb:schemaBindings>

1 个答案:

答案 0 :(得分:0)

您会感到惊讶,但是旧式XML包含适用于XJB文件。

binding.xjb

<!DOCTYPE jaxb:bindings [
<!ENTITY gh24type SYSTEM "gh24type.xml">
]>
<jaxb:bindings
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:annox="http://annox.dev.java.net"
    jaxb:extensionBindingPrefixes="annox"

    jaxb:version="2.1">

    <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
        <!-- ... -->
        &gh24type;
    </jaxb:bindings>
</jaxb:bindings>

gh24type.xml

<jaxb:bindings node="xsd:complexType[@name='gh24Type']">
    <annox:annotate>@javax.annotation.Generated({"jaxb2-annotate-plugin"})</annox:annotate>
</jaxb:bindings>

所以基本上没什么了不起的,只是entity-based XML inclusion。如果您具有完全相同的片段,则只需为您所涉及的每个模式多次包含您的实体。

替代方案是编写一个特殊的插件来简化自定义。无论如何,这可能是一个好主意。