2010-07-01 6 views
5

Quelqu'un peut-il un chiffre mon problème est ...Java Webservice objet null retour à un client .net

J'appelle un webmethod d'un Java Webservice (axe 1.4) d'un client .Net. Cette méthode retourne un objet Map, et si je l'appelle depuis un client Axis fonctionne bien, mais dans mon code C#, il est toujours nul.

C'est le WSDL:

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:http.service.enlaces.portlet.ext.com" xmlns:intf="urn:http.service.enlaces.portlet.ext.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://model.enlaces.portlet.ext.com" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:http.service.enlaces.portlet.ext.com"> 

<wsdl:types> 

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xml.apache.org/xml-soap"> 
<import namespace="urn:http.service.enlaces.portlet.ext.com"/> 
<import namespace="http://model.enlaces.portlet.ext.com"/> 
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> 
<complexType name="mapItem"> 
    <sequence> 
<element name="key" nillable="true" type="xsd:anyType"/> 
<element name="value" nillable="true" type="xsd:anyType"/> 
    </sequence> 
</complexType> 
<complexType name="Map"> 
    <sequence> 
    <element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem"/> 
    </sequence> 
</complexType> 
</schema> 
</wsdl:types> 

<wsdl:message name="getFoldersAndBookmarksRequest" /> 
<wsdl:message name="getFoldersAndBookmarksResponse"> 
    <wsdl:part name="getFoldersAndBookmarksReturn" type="apachesoap:Map" /> 
</wsdl:message> 

<wsdl:portType name="BookmarksEntryServiceSoap"> 
<wsdl:operation name="getFoldersAndBookmarks"> 
     <wsdl:input name="getFoldersAndBookmarksRequest" message="intf:getFoldersAndBookmarksRequest" /> 
     <wsdl:output name="getFoldersAndBookmarksResponse" message="intf:getFoldersAndBookmarksResponse" /> 
    </wsdl:operation> 
    </wsdl:portType> 

<wsdl:binding name="Portlet_Bookmarks_BookmarksEntryServiceSoapBinding" type="intf:BookmarksEntryServiceSoap"> 
    <wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" /> 
    <wsdl:operation name="getFoldersAndBookmarks"> 
     <wsdlsoap:operation soapAction="" /> 
     <wsdl:input name="getFoldersAndBookmarksRequest"> 
     <wsdlsoap:body use="encoded" namespace="urn:http.service.enlaces.portlet.ext.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> 
     </wsdl:input> 
     <wsdl:output name="getFoldersAndBookmarksResponse"> 
     <wsdlsoap:body use="encoded" namespace="urn:http.service.enlaces.portlet.ext.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> 
     </wsdl:output> 
    </wsdl:operation> 
</wsdl:binding> 

et mon C# code généré automatiquement:

[System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:http.service.enlaces.portlet.ext.com", ResponseNamespace="urn:http.service.enlaces.portlet.ext.com")] 
[return: System.Xml.Serialization.SoapElementAttribute("getFoldersAndBookmarksReturn")] 
public Map getFoldersAndBookmarks() { 
    object[] results = this.Invoke("getFoldersAndBookmarks", new object[0]); 
    return ((Map)(results[0])); 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.SoapTypeAttribute(Namespace="http://xml.apache.org/xml-soap")] 
public partial class Map { 

    private mapItem[] itemField; 

    /// <comentarios/> 
    public mapItem[] item { 
     get { 
      return this.itemField; 
     } 
     set { 
      this.itemField = value; 
     } 
    } 
} 

I, ai vu partout, malheureusement, je ne trouve pas la solution. S'il vous plaît, il y a quelqu'un que sait-il?

+0

Nous avons rencontré des problèmes similaires, où .NET ne pouvait pas deserialize correctement des tableaux tel que fourni par un service SOAP généré Axis. Malheureusement, pour nous, la solution consistait à utiliser autre chose qu'Axis pour générer les services Web. J'ai travaillé sur le côté .NET de la clôture, donc je ne peux pas dire exactement ce que c'était (ou j'aurais posté une réponse); Toutefois, envisagez d'examiner d'autres moteurs de service SOAP basés sur Java. – kbrimington

Répondre

0

Et c'est pourquoi les services Web générés à partir du code ne sont presque jamais interopérables :)

Une bonne façon de contourner cela est de faire wsdl d'abord, et de définir un joli petit peu claire de XSD, qui devrait la carte bien dans les deux. Net et Java. Une alternative est quelque chose d'autre que l'axe 1.4 (yech, la douleur) pour le serveur si vous avez un contrôle sur cela. Enfin, essayez de masser les signatures dans le code java, essayez de remplacer List par MapItem [], ou vice versa, assurez-vous que Map ne figure nulle part dans un objet de retour ou un paramètre.

En examinant à nouveau votre fichier wsdl généré, je dirais que c'est probablement dû au xsd: anyType pour la partie clé/valeur du mapItem.

Je pense que c'est ce qui est généré par l'axe si vous avez un objet java dans un paramètre. Crois-moi, tu ne veux pas ça. Faites-en une chaîne, ou un type complexe, ou un entier, mais un objet ne peut impliquer que xml à extrémité ouverte (xsd: anyType) et pas beaucoup de clients, pas comment analyser cela.

0

J'ai fait face au même problème il y a un certain temps. Cela se produit lorsque vous essayez d'obtenir un tableau d'éléments via un service Web axis avec un client .net.

Le problème est "Nom = item" une partie de cette ligne:

<element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem"/> 

Essayez de changer dans cette ligne particulière "élément" à "mapItem". Essayez l'un de ces:

<element maxOccurs="unbounded" minOccurs="0" name="mapItem" type="apachesoap:mapItem"/> 

ou

<element maxOccurs="unbounded" minOccurs="0" name="key" type="apachesoap:mapItem"/> 

ou

<element maxOccurs="unbounded" minOccurs="0" name="value" type="apachesoap:mapItem"/> 
1

donc très tard pour vous aider, mais j'ai récemment été en cours d'exécution dans le même problème.

Premièrement, j'utilise Eclipse pour créer un service Web. Le problème pour moi était que le wsdd généré utilisait le style 'document/literal (wrapped)'. Changer cela en 'RPC' a résolu le problème. Plus de null. Donc, peut-être que si vous changez votre encodage en RPC, cela pourrait aussi résoudre votre problème.

0

je faisais face à cela, et je devais changer fichier WSDL afin:

<wsdlsoap:body use="encoded" ... 

à

<wsdlsoap:body use="literal" ... 

uniquement pour effectuer la génération de proxy.

0

J'ai fait face au même problème. Ma solution consiste à supprimer l'espace de noms dans la fonction générée automatiquement. Ceci est ma fonction:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.service-now.com/incident/getRecords", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)] 
[return: System.Xml.Serialization.XmlArrayAttribute("getRecordsResponse", Namespace = "")] 
[return: System.Xml.Serialization.XmlArrayItemAttribute("getRecordsResult", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)] 
public getRecordsResponseGetRecordsResult[] getRecords([System.Xml.Serialization.XmlElementAttribute("getRecords", Namespace = "http://www.service-now.com/incident")] getRecords getRecords1) 
{ 
    object[] results = this.Invoke("getRecords", new object[] { 
       getRecords1}); 
    return ((getRecordsResponseGetRecordsResult[])(results[0])); 
} 

J'ai enlevé le Namespace dans cette ligne. Quand j'ai testé le service web via SoapUI, j'ai réalisé que l'objet réponse n'avait pas d'espace de nom. Mais le code généré automatiquement a un espace de nom.

[return: System.Xml.Serialization.XmlArrayAttribute("getRecordsResponse", Namespace = "")] 

SoapUI La réponse a été comme suit:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <SOAP-ENV:Body> 
     <getRecordsResponse> 
     <getRecordsResult> 
      <active>0</active> 
     </getRecordsResult> 
     </getRecordsResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Questions connexes