2009-01-16 12 views
1

Donc, je reçois des erreurs de compilation sur le code de service Web généré par netbeans 6.5 pour un client ME Java sur un service web C# (vs2005). J'ai réduit mon exemple de manière significative, et il montre toujours le problème, et ne pas être en mesure de retourner une collection de choses est à peu près un deal-breaker.Retour tableaux à partir du service Web .net au service Web Java ME entraîne l'erreur de compilation de stub?

C# service web (SimpleWebService.asmx)

<%@ WebService Language="C#" Class="SimpleWebService" %> 

using System; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

[WebService(Namespace = "http://sphereinabox.com/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class SimpleWebService : System.Web.Services.WebService { 

    [WebMethod] 
    public CustomType[] GetSomething() { 
     return new CustomType[] {new CustomType("hi"), new CustomType("bye")}; 
    } 
    public class CustomType { 
     public string Name; 
     public CustomType(string _name) { 
      Name = _name; 
     } 
     public CustomType() { 
     } 
    } 
} 

WSDL (automatiquement généré par VS2005):

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://sphereinabox.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://sphereinabox.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:types> 
    <s:schema elementFormDefault="qualified" targetNamespace="http://sphereinabox.com/"> 
     <s:element name="GetSomething"> 
     <s:complexType /> 
     </s:element> 
     <s:element name="GetSomethingResponse"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="GetSomethingResult" type="tns:ArrayOfCustomType" /> 
      </s:sequence> 
     </s:complexType> 
     </s:element> 
     <s:complexType name="ArrayOfCustomType"> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="unbounded" name="CustomType" nillable="true" type="tns:CustomType" /> 
     </s:sequence> 
     </s:complexType> 
     <s:complexType name="CustomType"> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" /> 
     </s:sequence> 
     </s:complexType> 
    </s:schema> 
    </wsdl:types> 
    <wsdl:message name="GetSomethingSoapIn"> 
    <wsdl:part name="parameters" element="tns:GetSomething" /> 
    </wsdl:message> 
    <wsdl:message name="GetSomethingSoapOut"> 
    <wsdl:part name="parameters" element="tns:GetSomethingResponse" /> 
    </wsdl:message> 
    <wsdl:portType name="SimpleWebServiceSoap"> 
    <wsdl:operation name="GetSomething"> 
     <wsdl:input message="tns:GetSomethingSoapIn" /> 
     <wsdl:output message="tns:GetSomethingSoapOut" /> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="SimpleWebServiceSoap" type="tns:SimpleWebServiceSoap"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="GetSomething"> 
     <soap:operation soapAction="http://sphereinabox.com/GetSomething" style="document" /> 
     <wsdl:input> 
     <soap:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:binding name="SimpleWebServiceSoap12" type="tns:SimpleWebServiceSoap"> 
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    <wsdl:operation name="GetSomething"> 
     <soap12:operation soapAction="http://sphereinabox.com/GetSomething" style="document" /> 
     <wsdl:input> 
     <soap12:body use="literal" /> 
     </wsdl:input> 
     <wsdl:output> 
     <soap12:body use="literal" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="SimpleWebService"> 
    <wsdl:port name="SimpleWebServiceSoap" binding="tns:SimpleWebServiceSoap"> 
     <soap:address location="http://localhost/SimpleWebService/SimpleWebService.asmx" /> 
    </wsdl:port> 
    <wsdl:port name="SimpleWebServiceSoap12" binding="tns:SimpleWebServiceSoap12"> 
     <soap12:address location="http://localhost/SimpleWebService/SimpleWebService.asmx" /> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

généré (NetBeans) code qui ne parvient pas à compiler, cela a été créé en passant par la "Ajouter -> Nouvel assistant JavaME to Web Services". (SimpleWebService_Stub.java)

public ArrayOfCustomType GetSomething() throws java.rmi.RemoteException { 
     Object inputObject[] = new Object[] { 
     }; 

     Operation op = Operation.newInstance(_qname_operation_GetSomething, _type_GetSomething, _type_GetSomethingResponse); 
     _prepOperation(op); 
     op.setProperty(Operation.SOAPACTION_URI_PROPERTY, "http://sphereinabox.com/GetSomething"); 
     Object resultObj; 
     try { 
      resultObj = op.invoke(inputObject); 
     } catch(JAXRPCException e) { 
      Throwable cause = e.getLinkedCause(); 
      if(cause instanceof java.rmi.RemoteException) { 
       throw (java.rmi.RemoteException) cause; 
      } 
      throw e; 
     } 

//////// Error on next line, symbol ArrayOfCustomType_fromObject not defined 
     return ArrayOfCustomType_fromObject((Object[])((Object[]) resultObj)[0]); 
    } 

il se trouve avec cet exemple artificiel (le « CustomType » dans mon problème de production a plus d'un champ) Je reçois aussi des erreurs de ce code amusant dans le même produit (SimpleWebService_Stub.java) code généré. Les erreurs sont que la chaîne n'est pas définie (c'est la chaîne dans java, et d'ailleurs je pense que cela devrait parler de CustomType de toute façon).

private static string string_fromObject(Object obj[]) { 
    if(obj == null) return null; 
    string result = new string(); 
    return result; 
} 

Répondre

2

Il est clair que vous ne devriez pas utiliser de fantaisie intégrée des choses comme le générateur de stub de NetBeans. NoE, vous devriez utiliser le soleil (ou Sprint ... marque) générateur de stub que vous pouvez obtenir par:

  1. un clic droit sur votre projet
  2. sélectionnez Propriétés
  3. Sélectionnez Platform sur le côté gauche de la nouvelle boîte de dialogue
  4. Cliquez sur Gérer émulateurs sur le côté rigt
  5. Sélectionnez l'émulateur de votre choix (Sun Java (TM) Wirless Tookit 2.5 pour CLDC) à gauche de ce nouveau dialogue
  6. Cliquez sur le Outils & Extensions tab. Cliquez sur le bouton Open Utilities.
  7. Sélectionnez l'utilitaire Générateur Stub dans cette nouvelle boîte de dialogue
  8. Cry sur le grand nombre d'étapes et dialogues impliqués.
  9. Cliquez Lancer
  10. indiquer votre URL WSDL http://localhost/SimpleWebService/SimpleWebService.asmx?WSDL
  11. Indiquez votre chemin ouput ** C: \ code \ Simple Mobile \ src \ **
  12. Indiquez votre package de sortie de simplewebservice ou tout ce que vous
  13. Appuyez sur le bouton OK.
  14. Ignorez les erreurs concernant l'impossibilité de compiler si vous compilez avec netbeans. erreur: com.sun.tools.javac.Main est pas actif, dans le classpath .. erreur: comilation a échoué, les erreurs auraient été signalés
  15. Répéter tous les ci-dessus tout moment les changements de service Web, et les talons besoin d'être régénéré.
  16. Ecrivez un fichier batch pour cela afin de sauvegarder votre santé mentale.

Eh bien de toute façon, ce que je trouve dans le livre de Jonathan Knudsen "Kicking Butt avec MIDP et MSA: Création de grandes applications mobiles"

1

La réponse précédente est géniale, j'ai eu classcastexception quand j'ai utilisé la classe stub généré par netbeans, java moi plate-forme SDK 3 classes générées fonctionne comme un charme.

Java ME SDK plate-forme 3 et NetBeans 6.8 ne montre pas le bouton utilitaires open (ne peut pas cliquer dessus), mais vous pouvez ouvrir Java ME SDK plate-forme 3 pour générer la classe stub

créer un nouveau projet , faites un clic droit sur le nom du projet: ajoutez - autre choisissez un autre client de service Web mobile, spécifiez l'URL WSDL et woila, vous avez les classes générées qui fonctionnent.

0

dans le service Web, ajoutez l'attribut [Serializable] pour la classe CustomType. vous obtiendrez ArrayOfCustomType_fromObject() dans la classe stub.

Questions connexes