修正一下,具体版本是1.6.2.
本人使用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: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"
<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">
</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这个环节了).