我必须从我的java程序进行SOAP调用,为此我使用了apache轴.我的计划如下:
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
public class Project {
public static void main(String [] args) {
try {
String endpoint ="http://RequestUrl";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName(endpoint, "getFrsFileData"));
String value = (String) call.invoke(new Object[] { "24BB7","frs1001" } );
System.out.println(value);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
执行时会出现如下错误
- 例外:org.xml.sax.SAXException:反序列化参数 'getFrsFileDataReturn':找不到类型{解串器的http:// URL} FrsFileSoapDO在org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:277)在org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)在org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)在org.apache.axis.message.MessageElement.publishToHandler( MessageElement.java:1141)在org.apache.axis.message.RPCElement.deserialize(RPCElement.java:345)在org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)在org.apache.axis .client.Call.invoke(Call.java:2467)org.apache.axis.client.Call.invoke(Call.java:2366)atg.apache.axis.client.Call.invoke(Call.java:1812) )在Project.main(Project.java:33)org.xml.sax.SAXException:反序列化参数'getFrsFileDataReturn':找不到类型{http:// Url} FrsFileSoapDO的反序列化器
尝试使用SOAPUI进行相同的调用,但它没有帮助我调试它.
请帮我调试这个java代码,
谢谢
我得到了朋友的帮助,得到了答案.问题是soap调用会给出一个肥皂响应,它是一个类型为"FrsFileSoapDO"的bean.因为我没有在代码中提供任何代码来说明我的程序将如何理解收到的bean,这给了我一个错误,说"找不到类型的反序列化器{http://Url}FrsFileSoapDO".现在解决问题的步骤是
1)创建一个"QName"来说明"FrsFileSoapDO"引用的命名空间是什么.
2)创建Bean序列化程序(知道如何序列化bean),
3)创建一个Bean反序列化器(知道如何反序列化bean),
4)做映射说QName q映射到类FrsFileSoapDO.class(在此之前确保你有FrsFileSoapDO.class并且你已导入它)
现在让我们在程序中实现它,(我在这里只重复try块)
try {
String endpoint ="http://RequestUrl";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
QName q = new QName ("http://Url", "FrsFileSoapDO"); // step 1
BeanSerializerFactory bsf = new BeanSerializerFactory(FrsFileSoapDO.class,q); // step 2
BeanDeserializerFactory bdf = new BeanDeserializerFactory(FrsFileSoapDO.class,q); // step 3
call.registerTypeMapping(FrsFileSoapDO.class,q, bsf, bdf); //step 4
call.setOperationName(new QName(endpoint, "getFrsFileData"));
FrsFileSoapDO s = (FrsFileSoapDO) call.invoke(new Object[] { "24BB7","frs1001" } );
System.out.println(s.getFilename());
}
Run Code Online (Sandbox Code Playgroud)
这可以给我预期的输出.
函数Call,BeanSerializerFactory,BeanDeserializerFactory的文档可以在BeanSerializerFactory和BeanDeserializerFactory中找到.
| 归档时间: |
|
| 查看次数: |
12595 次 |
| 最近记录: |