找不到类型的反序列化器:错误

我必须从我的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()); } } } 

执行时出现如下错误

  • exception:org.xml.sax.SAXException:反序列化参数’getFrsFileDataReturn’:在org.apache.axis.message.RPCHandler.onStartChild(RPCHandler.java:277)找不到类型{http:// Url} FrsFileSoapDO的反序列化器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)atg.apache.axis.message.RPCElement.getParams(RPCElement.java:384)atg.apache.axis .client.Call.invoke(Call.java:2467)org.apache.axis.client.Call.invoke(Call.java:2366)org.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()); } 

这可以给我预期的输出。

函数Call,BeanSerializerFactory,BeanDeserializerFactory的文档可以在BeanSerializerFactory和BeanDeserializerFactory中找到。

我遇到了同样的问题。 我认为在您的代码中唯一的错误是在线下:

 call.setOperationName(new QName(endpoint, "getFrsFileData")); 

不应将端点用于QName构造函数参数。 如果你只是发送字符串参数,你可以把它留空,但是如果你应该从wsdl文件中提供一些复杂的数据。 检查wsdl文件中此Web服务方法的参数,并在此处给出相同的映射。 例如对我来说这是一个文件传输,所以wsdl中的条目是:

     

并在客户端代码中给出相同的类型,如:

 call.setOperationName( new QName("apachesoap:MatrixService", "sendFile") ); QName fileAttachment = new QName("apachesoap:MatrixService", "DataHandler"); 

在此之后,您需要使用registerTypeMapping定义相同的地图。