не удалось найти десериализатор для типа: ошибка - PullRequest
3 голосов
/ 27 марта 2012

Я должен сделать SOAP-вызов из моей java-программы, для которой я использовал apache axis. Моя программа выглядит следующим образом:

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-кода,

Спасибо

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

Я получил помощь от моего друга и смог прийти к ответу.Проблема в том, что вызов soap дает ответ мыла, который приходит в виде компонента типа "FrsFileSoapDO".Поскольку я не дал ничего в коде того, как моя программа будет воспринимать полученный bean-компонент, это дало мне сообщение об ошибке «не удалось найти десериализатор для типа {http://Url}FrsFileSoapDO».Чтобы устранить проблему, нужно сделать следующее:

1) создать «QName», чтобы сказать, к какому пространству имен относится «FrsFileSoapDO».

2) создать сериализатор Bean (который знает, каксериализуйте бин),

3) создайте десериализатор бина (который знает, как десериализовать бин),

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

0 голосов
/ 25 июля 2013

Я столкнулся с той же проблемой. Единственная ошибка, я думаю, в вашем коде ниже строки:

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

Вы не должны использовать конечную точку для параметра конструктора QName. Либо вы можете оставить его пустым, если вы отправляете только строковые параметры, но в случае некоторых сложных данных вы должны предоставить здесь отображение из файла wsdl. Проверьте параметры в файле wsdl для этого метода веб-службы и приведите здесь такое же сопоставление. Например, для меня это была передача файла, поэтому запись в 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.

...