Re: Tuscany自动生成的WebService的WSDL文件格式有问题,会自动将wsdl:fault中的message属性前加入了错误的namespace

78 views
Skip to first unread message

DT

unread,
Jul 17, 2012, 10:41:09 PM7/17/12
to tuscany-s...@googlegroups.com
修正一下,具体版本是1.6.2.

在 2012年7月17日星期二UTC+8下午2时46分57秒,DT写道:
本人使用Tsucany SCA 1.6的版本:

最近在测试Tuscany生成的WSDL是否可用于生成客户端,结果发现WSDL中对于Exception的处理存在问题:
这是我写的一个简单的服务通过Tuscany自动生成的WSDL文件,请大家注意加粗加下划线的部分:


test.wsdl:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="TestWebCtrlService"
<wsdl:types>
<xs:schema targetNamespace="http://lang.java/" version="1.0"
<xs:element name="Exception" type="tns:Exception" />
<xs:complexType name="Exception">
<xs:sequence>
<xs:element minOccurs="0" name="message" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:schema>
<xs:schema attributeFormDefault="qualified"
elementFormDefault="unqualified" targetNamespace="http://test.shine.com/"
<xs:element name="testSingle">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="arg0" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="testSingleResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return" nillable="true"
type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
</wsdl:types>
<wsdl:message name="testSingle">
<wsdl:part name="testSingle" element="testSingle">
</wsdl:part>
</wsdl:message>
<wsdl:message name="Exception">
<wsdl:part name="Exception" element="ns4:Exception">
</wsdl:part>
</wsdl:message>
<wsdl:message name="testSingleResponse">
<wsdl:part name="testSingleResponse" element="testSingleResponse">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="TestWebCtrl">
<wsdl:operation name="testSingle">
<wsdl:input message="testSingle">
</wsdl:input>
<wsdl:output message="testSingleResponse">
</wsdl:output>
<wsdl:fault name="Exception" message="ns4:Exception">
</wsdl:fault>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TestWebCtrlBinding" type="TestWebCtrl">
<SOAP:binding style="document"
<wsdl:operation name="testSingle">
<SOAP:operation />
<wsdl:input>
<SOAP:body use="literal" />
</wsdl:input>
<wsdl:output>
<SOAP:body use="literal" />
</wsdl:output>
<wsdl:fault name="Exception">
<SOAP:fault name="Exception" use="literal" />
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestWebCtrlService">
<wsdl:port name="TestWebCtrlPort" binding="TestWebCtrlBinding">
<SOAP:address location="http://localhost:8080/DemoService/ws/Test" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

使用上述的WSDL文件,通过下列命令生成客户端,会出错:
org.apache.tuscany.tools.wsdl2java.generate.WSDL2JavaGenerator test.wsdl

提示出错:
java.util.NoSuchElementException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:796)
at java.util.HashMap$ValueIterator.next(HashMap.java:822)
at org.apache.tuscany.tools.wsdl2java.generate.JavaInterfaceGenerator.generateFaults(JavaInterfaceGenerator.java:265)
at org.apache.tuscany.tools.wsdl2java.generate.JavaInterfaceGenerator.<init>(JavaInterfaceGenerator.java:111)
at org.apache.tuscany.tools.wsdl2java.generate.WSDL2JavaGenerator.generateFromWSDL(WSDL2JavaGenerator.java:240)
at org.apache.tuscany.tools.wsdl2java.generate.WSDL2JavaGenerator.main(WSDL2JavaGenerator.java:154)
Exception in thread "main" java.lang.IllegalArgumentException: java.util.NoSuchElementException
at org.apache.tuscany.tools.wsdl2java.generate.WSDL2JavaGenerator.generateFromWSDL(WSDL2JavaGenerator.java:248)
at org.apache.tuscany.tools.wsdl2java.generate.WSDL2JavaGenerator.main(WSDL2JavaGenerator.java:154)
Caused by: java.util.NoSuchElementException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:796)
at java.util.HashMap$ValueIterator.next(HashMap.java:822)
at org.apache.tuscany.tools.wsdl2java.generate.JavaInterfaceGenerator.generateFaults(JavaInterfaceGenerator.java:265)
at org.apache.tuscany.tools.wsdl2java.generate.JavaInterfaceGenerator.<init>(JavaInterfaceGenerator.java:111)
at org.apache.tuscany.tools.wsdl2java.generate.WSDL2JavaGenerator.generateFromWSDL(WSDL2JavaGenerator.java:240)
... 1 more




>>>>通过将上文中的红色中的粗体带下划线的去掉ns4改为
<wsdl:fault name="Exception" message="Exception"> 

即可正确生成客户端.

通过观察,发现这个message应该是指向上面的<message />的定义,而上面的定义没有在ns4的名字空间下,导致寻找出错.

感觉这个问题应该是个BUG,有人发现同样的问题吗?如何解决?

请高手赐教,谢谢.


另外:如果使用Tuscany作为客户端调用自己生成的WebService,不会出错.(应该是直接跳过了WSDL这个环节了). 




DT

unread,
Aug 28, 2012, 12:15:30 PM8/28/12
to tuscany-s...@googlegroups.com
此问题是Tuscany的BUG,已在1.6.x的trunk中解决了,通过同步WSDL部分的代码可以解决此问题。
 It was reported as TUSCANY-3778 and it was fixed
in the 1.x trunk under revision r1036533. 
Reply all
Reply to author
Forward
0 new messages