问题描述
这让我疯了。我有一个嵌入WSDL中需要自定义的模式,因为WSIMPORT抛出以下错误
This is driving me insane. I have a schema embedded within a WSDL that needs customization because WSIMPORT is throwing the following error
[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)手动修复此命名冲突是不可接受的,因为我需要将存根的构造包含在自动构建链中。
1) I have no control over this WSDL as I am building a WSDL first client and I expect it to go over revisions w/o any formal consultation or release to me.2) It is not acceptable any longer to manually fix this naming collision because I need to include the construction of stubs into an automated build chain.
我必须使用外部自定义文件。我似乎无法弄清楚如何使自定义工作。
I must use an external customization file. I just can't seem to figure out how to get the customization to work.
这是违规的WSDL片段:
Here is the offending WSDL fragment:
<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技能的绝佳机会。任何帮助将不胜感激。
This would be a great chance for you to flex your JAXB skills. Any help would be greatly appreciated.
我一直盯着jaxb文档几个小时但仍然没有运气。如果需要,我可以提供整个WSDL。有人可以帮忙吗?
I've been staring at the jaxb documentation for hours and still no luck. I can offer the entire WSDL if need be. Can anyone help?
推荐答案
今天早上我来上班,能够解决这个问题。有时只是远离问题并以新头回来是最好的方法。以下是适合我的解决方案:
Well this morning I came in to work and was able to figure this out. Sometimes just walking away from the problem and coming back with a fresh head is the best way. Here is the solution that worked for me:
<?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工具。
I use the above external binding file with the wsimport tool in the following command.
关于此绑定文件的重要事项:
Important things about this binding file:
- 使用jaxws绑定的命名空间。这是我可以让节点选择正常工作的唯一方法
-
节点选择必须以/ xs:complexType结尾。如果您停止选择元素名称,编译器将生成错误。
- The namespace for jaxws bindings is used. This is the only way I could get the node selection to work properly
The node selection has to end with /xs:complexType. If you stop at selecting the the element name the compiler will generate errors.
wsimport -d generated -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl
wsimport -d generated -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl
使用的选项:
-d generated 指定输出目录(名为'的文件夹)在这种情况下生成'
-b ArtesiaExternalBinding.xml 告诉JAXB编译器使用绑定文件。
-keep 保留存根(我只是使用存根进行检查)
Options used:
-d generated specifies the output directory (a folder named 'generated' in this case)
-b ArtesiaExternalBinding.xml tells the JAXB compiler to use the binding file.
-keep keep the stubs (i just use the stubs for inspection)
最后,我发现这是最有帮助的信息:
finally, I found this to be the most helpful tidbit of information:java.net documents on jaxws customizations
这就是我在jaxws标记中嵌套jaxb自定义的原因。感谢您的链接 Petru Gardea
This is what lead me to nesting the jaxb customizations within jaxws tags. Thanks for the link Petru Gardea
这篇关于使用格式错误的WSDL进行JAXB自定义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!