使用JAXB从XMLSchema.xsd生成Java类
我正在使用jaxb从xml模式生成java类。 模式导入XMLSchema.xsd,其内容用作文档中的元素 如果我分别删除对“xsd:schema”的导入和引用,那么绑定编译器将成功生成这些类。 如果我不这样做,那么它将产生以下错误,如果我尝试仅从XMLSchema.xsd生成Java类,这些错误是相同的使用JAXB从XMLSchema.xsd生成Java类,java,jaxb,Java,Jaxb,我正在使用jaxb从xml模式生成java类。 模式导入XMLSchema.xsd,其内容用作文档中的元素 如果我分别删除对“xsd:schema”的导入和引用,那么绑定编译器将成功生成这些类。 如果我不这样做,那么它将产生以下错误,如果我尝试仅从XMLSchema.xsd生成Java类,这些错误是相同的 > C:\Users\me>"%JAXB%/xjc" -extension -d tmp/uisocketdesc -p uis.jaxb uisocketdesc.xsd -b
> C:\Users\me>"%JAXB%/xjc" -extension -d tmp/uisocketdesc -p uis.jaxb uisocketdesc.xsd -b xml_binding_test.xml -b xml_binding_test_2.xml
-b xml_binding_test_3.xml
parsing a schema...
compiling a schema...
> [ERROR] A class/interface with the same name "uis.jaxb.ComplexType" is already in use. Use a class customization to resolve this conflict.
line 612 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "ComplexType" is generated from here.
line 440 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.Attribute" is already in use. Use a class customization to resolve this conflict.
line 364 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "Attribute" is generated from here.
line 1020 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.SimpleType" is already in use. Use a class customization to resolve this conflict.
line 2278 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "SimpleType" is generated from here.
line 2222 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.Group" is already in use. Use a class customization to resolve this conflict.
line 930 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "Group" is generated from here.
line 727 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.AttributeGroup" is already in use. Use a class customization to resolve this conflict.
line 1062 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "AttributeGroup" is generated from here.
line 1026 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] A class/interface with the same name "uis.jaxb.Element" is already in use. Use a class customization to resolve this conflict.
line 721 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Relevant to above error) another "Element" is generated from here.
line 647 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 1020 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 364 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 2278 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 2222 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 930 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 727 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 440 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 612 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 1026 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 1062 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] Two declarations cause a collision in the ObjectFactory class.
line 647 of "http://www.w3.org/2001/XMLSchema.xsd"
> [ERROR] (Related to above error) This is the other declaration.
line 721 of "http://www.w3.org/2001/XMLSchema.xsd"
Failed to produce code.
看起来您的架构已被破坏。XJC对这些事情非常挑剔,在其他工具允许的事情上可能会失败
我发现通过第一步运行模式更容易,而不是挑拣XJC的错误。这提供了一个很好的、人类可读的(无论如何,开发人员可读的)错误输出。如果它顺利通过,那么您也将有更好的机会通过XJC。您可以使用JDK1.6附带的XJC。您还可以尝试XML到Java,请参阅。您可以通过(至少)两种方法成功地让JAXB为XML模式xsd生成代码。您遇到的问题源于某些模式类型和元素共享相同的名称
第一个选项通过对生成的类名应用一个或多个XML名称转换来避免名称冲突。以下是执行此操作的外部绑定文件的示例:
<jxb:bindings version="2.1"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc">
<jxb:globalBindings>
<xjc:simple/>
</jxb:globalBindings>
<jxb:bindings schemaLocation="XMLSchema.xsd">
<jxb:schemaBindings>
<jxb:nameXmlTransform>
<jxb:elementName suffix="Element"/>
</jxb:nameXmlTransform>
</jxb:schemaBindings>
</jxb:bindings>
</jxb:bindings>
在我看来,这提供了更清晰的生成类名,并成功地编译了模式
我还建议对XMLSchema.xsd使用单独的编译,并将其保存在jar文件中,以备以后在编译另一个模式时再次出现此问题时使用。答案描述了如何解决这类问题。对我来说,这是区分大小写的问题,元素和属性问题的名称相同(有时通过继承)。对于第二个问题,我使用的外部绑定文件包含以下内容:
<jaxb:bindings node="//xs:complexType[@name='AbstractGriddedSurfaceType']//xs:attribute[@name='rows']">
<jaxb:property name="rowCount"/>
</jaxb:bindings>
对于区分大小写的问题,您可以使用xjc参数-XautoNameResolution,maven版本是-B-XautoNameResolution
,但这不适用于包装器元素,因此对于这些元素,您需要编写上述jaxb定制。。。如果你像我一样不幸:)你可能需要使用xsd的本地副本并手动修复重复
编辑
找到了另一个解决方案,解决了仅重命名元素还不够的区分大小写问题:
<jaxb:bindings node=".//xs:element[@name='imageDatum'][@type='gml:ImageDatumPropertyType']">
<jaxb:property name="imageDatumInst"/>
<jaxb:factoryMethod name="imageDatumInst" />
</jaxb:bindings>
祝你好运,希望这能有所帮助。在使用cxf从.wsdl生成对象时,我遇到了同样的问题。我的解决方案是使用错误消息建议的-autonamesolution。Maven配置:
<wsdlOption>
<wsdl>${basedir}/test.wsdl</wsdl>
<extraargs>
<extraarg>-b</extraarg>
<extraarg>http://www.w3.org/2001/XMLSchema.xsd</extraarg>
<extraarg>-autoNameResolution</extraarg>
</extraargs>
<packagenames>
<packagename>test.wsdl</packagename>
</packagenames>
</wsdlOption>
${basedir}/test.wsdl
-b
http://www.w3.org/2001/XMLSchema.xsd
-自动命名解析
test.wsdl
我尝试了以下方法,但效果不错:
另一个选项是删除
-p
选项,以便在不同的包中生成类我遇到了相同的错误,并完全删除了
。这解决了我的问题。感谢SQC提供的提示,尽管它没有识别上述问题。链接似乎已断开。你能提供一个新的吗?面临类似的问题。但是我有大约50个这样的变量,还有其他的解决方案吗?这就是我想要的。谢谢是的,我试图通过指定一个包来保持整洁。一旦我把-p拿出来让它撕开,它就没有问题了。谢谢克里斯托斯。
<wsdlOption>
<wsdl>${basedir}/test.wsdl</wsdl>
<extraargs>
<extraarg>-b</extraarg>
<extraarg>http://www.w3.org/2001/XMLSchema.xsd</extraarg>
<extraarg>-autoNameResolution</extraarg>
</extraargs>
<packagenames>
<packagename>test.wsdl</packagename>
</packagenames>
</wsdlOption>
<jxb:bindings schemaLocation="ClaimActivity-ACORD.xsd">
<jxb:schemaBindings>
<jxb:package name="x.x.x.x" />
</jxb:schemaBindings>
<jxb:bindings node="//xsd:complexType[@name='ConstructionType']">
<jxb:class name="AbstractConstructionType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name='ItemDefinitionType']">
<jxb:class name="AbstractItemDefinitionType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name='LocationType']">
<jxb:class name="AbstractLocationType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name='TaxFeeType']">
<jxb:class name="AbstractTaxFeeType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name='DeductibleType']">
<jxb:class name="AbstractDeductibleType" />
</jxb:bindings>
<jxb:bindings node="//xsd:complexType[@name='RegistrationType']">
<jxb:class name="AbstractRegistrationType" />
</jxb:bindings>
</jxb:bindings>