Hallo all, this most probably is a stupid or at least simple question: How can I deserialize a complex Object which is returned from a Webservice implemented in .NET into some nice Java Object?
My scenario looks as follows: // The Environment I am running Apache Axis 1.3, Build date Oct. 5th, 2005 // The Service I have a service, implemented in C# on some IIS machine. This service returns a complex BusinessPartnerElements object. This object consists of several sub-objects like Person which itself consists of Name, Firstname, Tile and Sex which are Strings. // The Client The Java Client only wants to call the service and retrieve the BusinessPartnerElements object. Nothing more so far. Calling the service works and I received a SOAP response which looks pretty good to me: <SOAP Response> <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <BusinessPartnerRetrieveInResponse xmlns="http://sap.com/composite/prototype/webshop"> <ID xmlns="">123456</ID> <Organization xmlns=""> <CompanyName>myCorp</CompanyName> <LegalForm>Inc</LegalForm> </Organization> <Person xmlns=""> <Firstname>John</Firstname> <Lastname>Doe</Lastname> <Title>Phd</Title> <Sex>male</Sex> </Person> <Telefon xmlns=""> <Number>555 3535</Number> <Extension>01</Extension> <ValidityStartDate>0001-01-01</ValidityStartDate> <ValidityEndDate>0001-01-01</ValidityEndDate> </Telefon> <Email xmlns=""> <Address protocolCode="SMTP">[EMAIL PROTECTED]</Address> <ValidityStartDate>0001-01-01</ValidityStartDate> <ValidityEndDate>0001-01-01</ValidityEndDate> </Email> <WebAddress xmlns=""> <Address>http://www.mycorp.com/jdoe</Address> </WebAddress> <Address xmlns=""> <City>London</City> <PostalCode>NW23</PostalCode> <Street>Abbey Road</Street> <Building>4</Building> <ValidityStartDate>0001-01-01</ValidityStartDate> <ValidityEndDate>0001-01-01</ValidityEndDate> </Address> </BusinessPartnerRetrieveInResponse> </soap:Body> </soap:Envelope> </SOAP Response> >From the WSDL file, I was able to create a bunch of Java proxy classes which can hold the BusinessPartnerElements Object. In order to tell Axis how to map the received stuff, I thought it would be enough to do something like this: <code> String endpoint = "http://p122851/WebService1/ShopService.asmx"; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName(new QName("http://sap.com/composite/prototype/webshop", "BusinessPartnerRetrieveIn")); call.setSOAPActionURI("http://sap.com/composite/prototype/webshop/Busine ssPartnerRetrieveIn"); // take care about the type mapping... qn = new QName( "urn:BusinessPartnerRetrieveIn", "BusinessPartnerElements" ); // BTW: it does not matter hat values are given for qn - the Exception remains the same :( BeanSerializerFactory bsf = new BeanSerializerFactory(BusinessPartnerElements.class, qn); BeanDeserializerFactory bdsf = new BeanDeserializerFactory(BusinessPartnerElements.class, qn); call.registerTypeMapping(BusinessPartnerElements.class, qn, bsf, bdsf); call.setReturnType( qn ); // Return type is our bean BusinessPartnerElements pbe = (BusinessPartnerElements)call.invoke(new Object[] {}); </code> But unfortunately, this throws an Exception: <exception> org.xml.sax.SAXException: Invalid element in <package>.BusinessPartnerElements - CompanyName </exception> This CompanyName Elements which SAX is complaining about is the first non-complex Object [String] of the first somplex sub-object, Organization. The BusinessPartnerElements Object looks somethig like this: BusinessPartnerElements '--> ID (String) '--> Organization (complex) _ _ _'--> CompanyName (String) _ _ _'--> LegalForm (String) '--> Person (complex) _ _ _'--> Firstname (String) . . . So, Axis does not have an issue with the ID thing but stumbles over the complex sub-types. My Idea was to somehow tell Axis about these complex sub-types and how to map them, just like I did with the root element [see code above] but I simply don't know _HOW_ All I read in the Axis Wiki is that Axis *can* handle these complex return types but I never found a description _how_. Also, the axis guides only respond with some Objects which only consist of simple types themselves. I really hope that you can help me with this since it really is a very important topic for me... If you have any questions, feel free to ask, I will provide code and whatever you need. Also, I could send you a postcard or even home-made cookies if that motivates you ;) I thank you very, very much for helping me! Cheers, Martin
