Web services 使用格式不良的WSDL的JAXB定制
这快把我逼疯了。我在WSDL中嵌入了一个需要定制的模式,因为WSIMPORT抛出了以下错误Web services 使用格式不良的WSDL的JAXB定制,web-services,soap,wsdl,jaxb,Web Services,Soap,Wsdl,Jaxb,这快把我逼疯了。我在WSDL中嵌入了一个需要定制的模式,因为WSIMPORT抛出了以下错误 [ERROR] Complex type and its child element share the same name "DomainsMap". Use a class customization to resolve this conflict. line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl 1) 我无法控制这个WSDL,因
[ERROR] Complex type and its child element share the same name "DomainsMap".
Use a class customization to resolve this conflict.
line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl
1) 我无法控制这个WSDL,因为我正在构建一个WSDL第一个客户机,我希望它在没有任何正式咨询或发布给我的情况下进行修订。
2) 手动修复此命名冲突不再是可接受的,因为我需要将存根的构造包含到自动构建链中
我必须使用外部自定义文件。我似乎不知道如何让定制工作正常进行
下面是有问题的WSDL片段:
<wsdl:definitions>
<wsdl:types>
<xs:schema>
.
.
.
<xs:complexType final="extension restriction" name="domainsMap">
<xs:sequence>
<xs:element name="domainsMap">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="entry">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="key" type="xs:string"/>
<xs:element minOccurs="0" name="value" type="tns:domainValueMap"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
.
.
.
这将是您展示JAXB技能的绝佳机会。任何帮助都将不胜感激
我已经盯着jaxb文档看了好几个小时了,但仍然没有什么好运气。如果需要,我可以提供整个WSDL。有人能帮忙吗 不清楚您是否尝试过,但我会做以下几点: -使用wsimport命令行中的-b选项(doc可用)。 -可以找到关于绑定文件的信息; -下面是一个深入的视图,其中有一些关于如何自定义以避免名称冲突的示例。我在这里提供一个摘录——它应该可以解决您的问题
<jxb:schemaBindings>
<jxb:package name="primer.myPo">
<jxb:javadoc>
<![CDATA[<body> Package level documentation for generated package primer.myPo.</body>]]>
</jxb:javadoc>
</jxb:package>
<jxb:nameXmlTransform>
<jxb:elementName suffix="Element"/>
</jxb:nameXmlTransform>
</jxb:schemaBindings>
生成的Package primer.myPo的包级文档。]]>
今天早上我来上班,并且能够弄明白这一点。有时候,离开问题,重新思考是最好的方法。以下是对我有效的解决方案:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
wsdlLocation="ArtesiaWebServices.wsdl">
<enableWrapperStyle>true</enableWrapperStyle>
<enableAsyncMapping>false</enableAsyncMapping>
<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainsMap']/xs:sequence/xs:element[@name='domainsMap']/xs:complexType">
<!-- This binding will fix the domainsMap inner element called domainsMap. sheesh, who names stuff like that?! -->
<jaxb:class name="DomainsMapElement"/>
</jaxws:bindings>
<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainValueMap']/xs:sequence/xs:element[@name='domainValueMap']/xs:complexType">
<!-- This binding will fix the domainValueMap inner element called domainValueMap. sheesh, who names stuff like that?! -->
<jaxb:class name="DomainValueMapElement"/>
</jaxws:bindings>
</jaxws:bindings>
真的
假的
我在下面的命令中将上述外部绑定文件与wsimport工具一起使用
有关此绑定文件的重要事项:
- 使用jaxws绑定的名称空间。这是使节点选择正常工作的唯一方法
- 节点选择必须以/xs:complexType结束。如果停止选择元素名称,编译器将生成错误 wsimport-d generated-keep-b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl
-d generated指定输出目录(本例中为名为“generated”的文件夹)
-b ArtesiaExternalBinding.xml告诉JAXB编译器使用绑定文件。
-保留保留存根(我只是用存根检查) 最后,我发现这是最有用的信息:
这就是我将jaxb定制嵌套在jaxws标记中的原因。谢谢你的链接佩特罗·加德亚对不起,我以为你会看完我在这里附加的链接;“关于绑定文件的信息”链接锚定在以下语句中:“这些JAXB绑定可以位于模式内部,也可以作为jaxws:bindings元素的子元素。”。。。在maven插件中使用
wsimport
时,如果没有magicjaxws
标记,这是行不通的。谢谢