我必须调用一个返回类似
的complexType的WS<WSResponse xmlns="http://uri.org/">
<ConvertResult>
<param1>string</param1>
<param2>string</param2>
<param3>int</param3>
<param4>string</param4>
</ConvertResult>
</WSResponse>
该部分的WSDL是
<s:element name="WSResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ConvertResult" type="tns:ISO"/>
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ISO">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="param1" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="param2" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="param3" type="s:int"/>
<s:element minOccurs="0" maxOccurs="1" name="param4" type="s:string"/>
</s:sequence>
</s:complexType>
我在java中使用此代码来执行此操作
Service service = new Service();
Call call = (Call) service.createCall();
call.setProperty( Call.SOAPACTION_USE_PROPERTY, true);
call.setProperty( Call.SOAPACTION_URI_PROPERTY, "http://uri.org/" + WebMethod);
call.setTargetEndpointAddress(endpointURL);
call.setOperationName(new QName("http://uri.org/", WebMethod));
call.addParameter(new QName("http://uri.org/","param"), XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(new QName("","ISO"), ISO.class);
Object params[]={ param };
Object ret = call.invoke(params);
ISO是
class ISO implements Serializable {
String param1;
String param2;
int param3;
String param4;
}
但是我得到了
反序列化参数'ConvertResult':找不到类型ISO
的反序列化器
我之前在WS调用中没有使用complexTypes,所以我有点迷失。我怎么想收到这个回复?我已经尝试将其添加到通话中
BeanSerializerFactory bsf = new BeanSerializerFactory(ISO.class,new QName("","ISO"));
BeanDeserializerFactory bdf = new BeanDeserializerFactory(ISO.class,new QName("","ISO"));
call.registerTypeMapping(ISO.class,new QName("","ISO"), bsf, bdf);
为this other question建议,但我得到了
SimpleDeserializer在尝试反序列化时遇到了一个不期望的子元素。
我想我有点混淆了我尝试过的所有解决方案(没有用)。我知道ws有效,因为我已经尝试将complexType
更改为一个简单的字符串(在ws中有相应的更改)并且它有效,所以我必须对返回类型做错了。
答案 0 :(得分:0)
好的,要解决这个问题:
我真的很困惑如何将WSDL映射到java代码。我的错误是手工完成ISO课程。我最终使用here
中的代码创建了该存根import org.apache.axis.wsdl.WSDL2Java;
public class Random {
public static void main(String[] args) {
String[] params = new String[] {"-v", "-D", "-o c:/projects/WSTest", "http://URL to WSDL file"};
try {
WSDL2Java.main(params);
} catch (Exception ex) {
ex.printStackTrace()
}
}
}
这是WSDL2Java,它拯救了生命。之后,我在文件夹中获得了一堆类,将它们复制到我的项目中,更改了包引用,并且瞧。最后的代码就是这个
call.addParameter(new QName("http://uri.org/","param"), XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(new QName("","ISO"), ISO.class);
Object params[]={ param };
ISO ret = (ISO) call.invoke(params);
我意识到这可能对很多人来说很简单,但我真的很困惑,我得到的不同错误和不同的解决方案让我更加困惑。我将它留在这里,以防它帮助了某人。
此doc对某些人也有用。