[RESOLU]SOAP & WSDL (java6)

SOAP & WSDL (java6) [RESOLU] - Java - Programmation

Marsh Posté le 19-08-2008 à 16:55:52    

Bonjour
 
j'essaye depuis presque 2jours de faire communiquer un client soap java avec un serveur soap php5
 
depuis ce matin j'arrive à faire un helloworld.
 
maintenant je bloque sur le passage de parametres ...
 
code de la fonction serveur sayHello


function sayHello($nom, $prenom){
 return array('reponse1' => 'Hello '.$nom, 'reponse2' => 'Hello '.$prenom);
}


 
(la fonction ne sert qu'a m'apprendre le SOAP/WSDL en java)
 
j'ai le wsdl :


<wsdl:types>
        <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="urn:HelloService">
            <xs:element name="sayHello">
              <xs:complexType>
               <xs:sequence>
                <xs:element name="nom" type="xs:string"/>
                <xs:element name="prenom" type="xs:string"/>
               </xs:sequence>
              </xs:complexType>
             </xs:element>
             
  <xs:element name="sayHelloResponse">
   <xs:complexType>
    <xs:sequence>
     <xs:element name="reponse1" type="xs:string"/>
     <xs:element name="reponse2" type="xs:string"/>
    </xs:sequence>
   </xs:complexType>
  </xs:element>
             
        </xs:schema>
    </wsdl:types>
 
 
    <wsdl:message name="sayHelloRequest">
        <wsdl:part name="name" element="ns:sayHello"/>
    </wsdl:message>
 
    <wsdl:message name="sayHelloResponse">
        <wsdl:part name="return" element="ns:sayHelloResponse"/>
    </wsdl:message>
     
 
    <wsdl:portType name="HelloServicePortType">
        <wsdl:operation name="sayHello">
            <wsdl:input message="ns:sayHelloRequest"/>
            <wsdl:output message="ns:sayHelloResponse"/>
        </wsdl:operation>
    </wsdl:portType>
 
    <wsdl:binding name="HelloServiceSoap11Binding" type="ns:HelloServicePortType">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
        <wsdl:operation name="sayHello">
            <soap:operation soapAction="sayHello" style="document"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
 
[...]


 
 
Le probleme c'est quand je fais wsimport -keep monwsdl et que je regarde HelloServicePortType.java j'ai  


public interface HelloServicePortType {
 
 
    /**
     *  
     * @param prenom
     * @param reponse1
     * @param reponse2
     * @param nom
     */
    @WebMethod(action = "sayHello" )
    @RequestWrapper(localName = "sayHello", targetNamespace = "urn:HelloService", className = "helloservice.SayHello" )
    @ResponseWrapper(localName = "sayHelloResponse", targetNamespace = "urn:HelloService", className = "helloservice.SayHelloResponse" )
    public void sayHello(
        @WebParam(name = "nom", targetNamespace = "urn:HelloService" )
        String nom,
        @WebParam(name = "prenom", targetNamespace = "urn:HelloService" )
        String prenom,
        @WebParam(name = "reponse1", targetNamespace = "urn:HelloService", mode = WebParam.Mode.OUT)
        Holder<String> reponse1,
        @WebParam(name = "reponse2", targetNamespace = "urn:HelloService", mode = WebParam.Mode.OUT)
        Holder<String> reponse2);
 
}


On voit que la fonction retourne void et que les resultats sont passés en parametres :/
 
alors que je m'attendais à


public interface HelloServicePortType {
 
 
    /**
     *  
     * @param prenom
     * @param reponse1
     * @param reponse2
     * @param nom
     */
    @WebMethod(action = "sayHello" )
    @RequestWrapper(localName = "sayHello", targetNamespace = "urn:HelloService", className = "helloservice.SayHello" )
    @ResponseWrapper(localName = "sayHelloResponse", targetNamespace = "urn:HelloService", className = "helloservice.SayHelloResponse" )
    public sayHelloResponse sayHello(
        @WebParam(name = "nom", targetNamespace = "urn:HelloService" )
        String nom,
        @WebParam(name = "prenom", targetNamespace = "urn:HelloService" )
        String prenom);
 
}


de cette facon je pouvais faire :  
SayHelloResponse res = server.sayHello("toto", "tutu" );
System.out.println(res.getReponse1() + "::" + res.getReponse2());
 
y a t'il un moyen d'obtenir ca ? Je me doute que oui mais je vois pas comment
Si quelqu'un pouvait m'éclairer ?


Message édité par ffluff le 25-08-2008 à 14:19:52
Reply

Marsh Posté le 19-08-2008 à 16:55:52   

Reply

Marsh Posté le 19-08-2008 à 20:28:32    

Vu sur : http://www.newsletterarchive.org/2 [...] WS,+Part+3
 
Rather than keeping the return type as JAX-RPC does, JAX-WS
makes the method void and makes use of the holder for what was the
return value. By rule in JAX-WS, when there is more than one parameter
that can be considered an OUT parameter for an operation, the return
type must be void, and all OUT parameters are mapped to holder types.
 
En somme, reponse1 et reponse2 seraient une sorte de passage par référence.
Au final, ils devraient être initialisés avec le contenu de ton array php. Ce qui revient au même qu'une valeur de retour
 
D'après ce qui est écrit ci-dessus, si tu retourne juste une chaine de caractère dans la fonction php, tu devrais avoir une valeur de retour du coté java
Ou alors si tu veux garder le même principe tu peux créer l'équivalent d'une classe java en php qui contiendrait tes deux string (je connais pas le php donc je sais pas si c'est possible).
 
A tester

Reply

Marsh Posté le 25-08-2008 à 14:18:56    

J'ai trouvé la solution tout seul en fait mais merci de ton aide  je fais :
 

Code :
  1. [...]
  2. <wsdl:types>
  3.  <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="urn:HelloService">
  4.   <xs:element name="sayHello">
  5.    <xs:complexType>
  6.     <xs:sequence>
  7.      <xs:element name="nom" type="xs:string"/>
  8.      <xs:element name="prenom" type="xs:string"/>
  9.     </xs:sequence>
  10.    </xs:complexType>
  11.   </xs:element>
  12.            
  13.   <xs:complexType name="sayHelloResponse">
  14.    <xs:sequence>
  15.     <xs:element name="reponse1" type="xs:string"/>
  16.     <xs:element name="reponse2" type="xs:string"/>
  17.    </xs:sequence>
  18.   </xs:complexType>
  19.   <xs:element name="sayHelloRes">
  20.    <xs:complexType>
  21.     <xs:sequence>
  22.      <xs:element name="reponse" type="ns:sayHelloResponse"/>
  23.     </xs:sequence>
  24.    </xs:complexType>
  25.   </xs:element>
  26.  </xs:schema>
  27. </wsdl:types>
  28.     <wsdl:message name="sayHelloRequest">
  29.         <wsdl:part name="name" element="ns:sayHello"/>
  30.     </wsdl:message>
  31.     <wsdl:message name="sayHelloResponse">
  32.         <wsdl:part name="return" element="ns:sayHelloRes"/>
  33.     </wsdl:message>
  34.    
  35.     <wsdl:portType name="HelloServicePortType">
  36.         <wsdl:operation name="sayHello">
  37.             <wsdl:input message="ns:sayHelloRequest"/>
  38.             <wsdl:output message="ns:sayHelloResponse"/>
  39.         </wsdl:operation>
  40.     </wsdl:portType>
  41.     <wsdl:binding name="HelloServiceSoap11Binding" type="ns:HelloServicePortType">
  42.         <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
  43.         <wsdl:operation name="sayHello">
  44.             <soap:operation soapAction="sayHello" style="document"/>
  45.             <wsdl:input>
  46.                 <soap:body use="literal"/>
  47.             </wsdl:input>
  48.             <wsdl:output>
  49.                 <soap:body use="literal"/>
  50.             </wsdl:output>
  51.         </wsdl:operation>
  52.     </wsdl:binding>
  53.     [...]


 
de cette facon la génération du wsdl me contruit automatiquement une class sayHelloResponse et je peux faire server.sayHello("nom", "prenom" ).getResponse1();

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed