将 JAXB 绑定片段导入其他绑定文件

Import JAXB binding snippet into other binding file

对于某个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 文件,我每次都必须为每个模式复制粘贴这些绑定。

是否可以 "extract" 绑定并将它们重新用于每个其他 xsd 文件,就像导入一样?这有点与有关。建议的解决方案是使用 jaxb:schemaBindings/jaxb:package,但如果我理解正确,则以下代码片段只会将 类 生成到另一个包中,并不能真正解决问题?

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

您会感到惊讶,但老式 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。如果您有完全相同的片段,只需为每个有问题的模式多次包含您的实体。

备选方案是编写一个特殊的插件来简化定制。无论如何这可能是个好主意。