【问题标题】:could not find deserializer for type : Error找不到类型的反序列化器:错误
【发布时间】:2012-03-27 07:10:58
【问题描述】:

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

    }
   }

执行时会报如下错误

  • 异常: 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) 在 org.apache.axis.client.Call.invoke(Call.java:1812) 在 Project.main(Project.java:33) org.xml.sax.SAXException:反序列化参数“getFrsFileDataReturn”:找不到类型 {http://Url}FrsFileSoapDO
  • 的反序列化器

使用 SOAPUI 尝试了相同的调用,但它没有帮助我调试它。

请帮我调试这段java代码,

谢谢

【问题讨论】:

    标签: java axis


    【解决方案1】:

    我得到了朋友的帮助,并得到了答案。 问题是soap调用给出了一个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 的文档可在 BeanSerializerFactoryBeanDeserializerFactory 获得

    【讨论】:

      【解决方案2】:

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

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

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

      <wsdl:message name="sendFileRequest">
        <wsdl:part name="in0" type="apachesoap:DataHandler"/>
        <wsdl:part name="in1" type="soapenc:string"/>
      </wsdl:message>
      

      并且在客户端代码中你给出了相同的类型:

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

      在此之后,您需要使用 registerTypeMapping 为其定义映射。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-29
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多