对于某个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>
答案 0 :(得分:0)
您会感到惊讶,但是旧式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。如果您具有完全相同的片段,则只需为您所涉及的每个模式多次包含您的实体。
替代方案是编写一个特殊的插件来简化自定义。无论如何,这可能是一个好主意。