Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Could not find deserializer for type.....


Автор: vasko 29.8.2006, 18:18
Необходимо написать код клиента (используется DII), который принимает в качестве результата работы сервер - класс.

Сервер. приложение
Код

public class FaqMakerService {

    public MakerInfo getByMakerName(String makerName) {
        System.out.println("getByMakerName: recieved name - " + makerName);
        MakerInfo maker = new MakerInfo();
        maker.FaqMaker = makerName;
        maker.Answer = 345;
        System.out.println("getByMakerName: Bewfore return");

        return maker;
    }
}

public class MakerInfo implements java.io.Serializable{
    public String FaqMaker;
    public int Answer;
}


wsdl файл 
Код

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://192.168.0.174:8080/axis/services/FaqMaker" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://192.168.0.174:8080/axis/services/FaqMaker" xmlns:intf="http://192.168.0.174:8080/axis/services/FaqMaker" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="urn:FaqMaker" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
 <wsdl:types>
  <schema targetNamespace="urn:FaqMaker" xmlns="http://www.w3.org/2001/XMLSchema">
   <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
   <complexType name="MakerInfo">
    <sequence>
     <element name="FaqMaker" nillable="true" type="xsd:string"/>
     <element name="Answer" type="xsd:int"/>
    </sequence>
   </complexType>
  </schema>
 </wsdl:types>

   <wsdl:message name="getByMakerNameRequest">
      <wsdl:part name="makerName" type="xsd:string"/>
   </wsdl:message>

   <wsdl:message name="getByMakerNameResponse">
      <wsdl:part name="getByMakerNameReturn" type="tns1:MakerInfo"/>
   </wsdl:message>

   <wsdl:portType name="FaqMakerService">
      <wsdl:operation name="getByMakerName" parameterOrder="makerName">
         <wsdl:input message="impl:getByMakerNameRequest" name="getByMakerNameRequest"/>
         <wsdl:output message="impl:getByMakerNameResponse" name="getByMakerNameResponse"/>
      </wsdl:operation>
   </wsdl:portType>

   <wsdl:binding name="FaqMakerSoapBinding" type="impl:FaqMakerService">
      <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="getByMakerName">
         <wsdlsoap:operation soapAction=""/>
         <wsdl:input name="getByMakerNameRequest">
            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"   namespace="http://DefaultNamespace" use="encoded"/>
         </wsdl:input>

         <wsdl:output name="getByMakerNameResponse">
            <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://192.168.0.174:8080/axis/services/FaqMaker" use="encoded"/>
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>

   <wsdl:service name="FaqMakerServiceService">
      <wsdl:port binding="impl:FaqMakerSoapBinding" name="FaqMaker">
         <wsdlsoap:address location="http://192.168.0.174:8080/axis/services/FaqMaker"/>
      </wsdl:port>
   </wsdl:service>

</wsdl:definitions>



Код клиента 
Код

void testFaqMaker() {
        String targetNamespace="http://192.168.0.174:8080/axis/services/FaqMaker";
        String nameService = "FaqMakerServiceService";
        String namePort = "FaqMaker";
        String endpointAddress = "http://192.168.0.174:8080/axis/services/FaqMaker";
        String nameMethod = "getByMakerName";

try {
            ServiceFactory factory = ServiceFactory. newInstance();
            Service service = factory.createService(new QName(nameService));

            javax.xml.rpc.encoding.TypeMappingRegistry mappingRegistry = service.getTypeMappingRegistry();
            javax.xml.rpc.encoding.TypeMapping typeMapping = mappingRegistry.createTypeMapping();
            registerBeanMapping(typeMapping, MakerInfo.class, "MakerInfo");
            mappingRegistry.register(targetNamespace, typeMapping);

            Call call = service.createCall(new QName(targetNamespace, namePort));

            call.setTargetEndpointAddress(endpointAddress);

            call.setProperty(Call.OPERATION_STYLE_PROPERTY, "rpc");
            call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, targetNamespace);

            call.setOperationName(new javax.xml.namespace.QName("http://DefaultNamespace", nameMethod));
            QName outType = new QName("urn:FaqMaker", "MakerInfo");
            call.addParameter("InParam1", StringQName, ParameterMode.IN);
            call.addParameter("OutParam", outType, ParameterMode.OUT);
            call.setReturnType(outType, MakerInfo.class);

            Object[] actualParams = new Object[] {"testName"};

            Object value= call.invoke(actualParams);
            value.toString();

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
}

protected void registerBeanMapping(TypeMapping mapping, Class type, String name) {
        QName qName = new QName("http://192.168.0.174:8080/axis/services/FaqMaker", "MakerInfo");
        mapping.register(type, qName,
        new BeanSerializerFactory(type, qName),
        new BeanDeserializerFactory(type, qName));
}


На invoke вылетает с ошибкой - 
"org.xml.sax.SAXException: Deserializing parameter 'getByMakerNameReturn':  could not find deserializer for type {urn:FaqMaker}MakerInfo"

В чем причина?

Автор: vasko 29.8.2006, 19:24
если делать через org.apache.axis.client.Service - 
Код

org.apache.axis.client.Service service = new org.apache.axis.client.Service();
        try {
            org.apache.axis.client.Call call = (org.apache.axis.client.Call) service.createCall();
            QName qn = new QName("urn:FaqMaker", "MakerInfo");
            //ukazivaem serializaciju i desirializaciju dlja beana Oreder
            call.registerTypeMapping(MakerInfo.class, qn,
                    new BeanSerializerFactory(MakerInfo.class, qn),
                    new BeanDeserializerFactory(MakerInfo.class, qn));

            call.setTargetEndpointAddress(new URL("http://192.168.0.174:8080/axis/services/FaqMaker"));
            call.setOperationName( new QName("http://DefaultNamespace", "getByMakerName"));
            call.setPortName(new QName("http://192.168.0.174:8080/axis/services/FaqMaker", "FaqMaker"));
            call.addParameter("arg1", new QName("http://www.w3.org/2001/XMLSchema", "string"), ParameterMode.IN);
            call.setReturnType(qn, MakerInfo.class);
            Object o = call.invoke(new Object[] {"testValue"});
            if (null != o) {
                o.toString();
            }

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }


то все работает...... Чего не хватает для DII?

Автор: Tony 30.8.2006, 00:00
Tebje нужно написать указать десиализатор(не могу виговорить smile)
Код

 <service name="OrderProcessor" provider="java:RPC">
            <parameter name="className" value="servis.BeanService"/>
            <parameter name="allowedMethods" value="*"/>
            <beanMapping qname="ns:Order" xmlns:ns="urn:BeanService" languageSpecificType="java:servis.Order"/>
     </service>



Автор: vasko 30.8.2006, 09:30
у меня в axis/web-inf/server-config.wsdd прописано - 
Код

<service name="FaqMaker" provider="java:RPC">
        <parameter name="className" value="FaqMakerService"/>
        <parameter name="allowedMethods" value="getByMakerName"/>
        <beanMapping qname="ns1:MakerInfo" xmlns:ns1="urn:FaqMaker" languageSpecificType="java:MakerInfo"/>
</service>

Автор: Tony 30.8.2006, 09:33
Посмотри пример http://forum.vingrad.ru/index.php?showtopic=107244

Автор: vasko 30.8.2006, 17:38
Как я уже писал, через org.apache.axis.client.Call у меня прекрасно все работает.
Не работает, если использовать технологию DII (чз javax.xml.rpc.Call работать)

Автор: Tony 31.8.2006, 00:17
Если я не ошибаюсь в онсове Axis лежит RPC. 4em тебе не нравится Axis client?

Автор: vasko 31.8.2006, 10:05
Требования

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)