将 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 文件。
<!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>
<jaxb:bindings node="xsd:complexType[@name='gh24Type']">
<annox:annotate>@javax.annotation.Generated({"jaxb2-annotate-plugin"})</annox:annotate>
</jaxb:bindings>
所以基本上没什么了不起的,只是 entity-based XML inclusion。如果您有完全相同的片段,只需为每个有问题的模式多次包含您的实体。
备选方案是编写一个特殊的插件来简化定制。无论如何这可能是个好主意。
对于某个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 文件。
<!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>
<jaxb:bindings node="xsd:complexType[@name='gh24Type']">
<annox:annotate>@javax.annotation.Generated({"jaxb2-annotate-plugin"})</annox:annotate>
</jaxb:bindings>
所以基本上没什么了不起的,只是 entity-based XML inclusion。如果您有完全相同的片段,只需为每个有问题的模式多次包含您的实体。
备选方案是编写一个特殊的插件来简化定制。无论如何这可能是个好主意。