IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Java Discussion :

Exceptions d'un client web service généré avec WSDL2Java d'Axis


Sujet :

Services Web Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut Exceptions d'un client web service généré avec WSDL2Java d'Axis
    Bonjour,

    J'ai utilisé l'outil WSDL2Java d'Axis pour générer le stub d'un service web dont je connais le contrat WSDL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost:8080/Hello/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Hello" targetNamespace="http://localhost:8080/Hello/">
      <wsdl:types>
        <xsd:schema targetNamespace="http://localhost:8080/Hello/">
          <xsd:element name="sayHello">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="name" type="xsd:string"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
     
          <xsd:element name="sayHelloResponse">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="message" type="xsd:string"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:schema>
      </wsdl:types>
     
      <wsdl:message name="sayHelloRequest">
            <wsdl:part name="parameters" element="tns:sayHello"></wsdl:part>
      </wsdl:message>
     
      <wsdl:message name="sayHelloResponse">
        <wsdl:part element="tns:sayHelloResponse" name="parameters"/>
      </wsdl:message>
     
      <wsdl:portType name="Hello">
        <wsdl:operation name="sayHello">
          <wsdl:input message="tns:sayHelloRequest"/>
          <wsdl:output message="tns:sayHelloResponse"/>
        </wsdl:operation>
      </wsdl:portType>
     
      <wsdl:binding name="HelloSOAP" type="tns:Hello">
      	<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
      	<wsdl:operation name="sayHello">
      		<soap:operation soapAction="http://localhost:8080/Hello/sayHello" />
      		<wsdl:input>
      			<soap:body use="literal" />
      		</wsdl:input>
      		<wsdl:output>
      			<soap:body use="literal" />
      		</wsdl:output>
      	</wsdl:operation>
      </wsdl:binding>
     
      <wsdl:service name="Hello">
        <wsdl:port binding="tns:HelloSOAP" name="HelloSOAP">
          <soap:address location="http://localhost:8080/"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>
    Pour générer le stub en question, j'ai entré la commande :
    java org.apache.axis.wsdl.WSDL2Java Hello.wsdl
    Les 4 fichiers suivants ont été générés :
    - Hello_PortType.java
    - Hello_Service.java
    - Hello_ServiceLocator.java
    - HelloSOAPStub.java

    J'ai ensuite créé un projet Java sous Eclipse en incluant ces fichiers ainsi que les librairies d'Axis, puis j'ai codé le client suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    package client;
     
    import java.rmi.RemoteException;
     
    import javax.xml.rpc.ServiceException;
     
    import localhost.Hello.Hello_PortType;
    import localhost.Hello.Hello_Service;
    import localhost.Hello.Hello_ServiceLocator;
     
    public class HelloClient {
    	public static void main(String[] args) {
    		try {
    			Hello_Service service = new Hello_ServiceLocator();
    			Hello_PortType port = service.getHelloSOAP();
    			String name = "Christophe";
    			String message = port.sayHello(name);
     
    			System.out.println(message);
    		} catch(RemoteException e) {
    			e.printStackTrace();
    		} catch(ServiceException e) {
    			e.printStackTrace();
    		}
    	}
    }
    Toutefois, je rencontre l'exception suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    AxisFault
     faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
     faultSubcode: 
     faultString: org.xml.sax.SAXParseException: The processing instruction target matching &quot;[xX][mM][lL]&quot; is not allowed.
     faultActor: 
     faultNode: 
     faultDetail: 
    	{http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXParseException: The processing instruction target matching &quot;[xX][mM][lL]&quot; is not allowed.
    	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
    	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPIData(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanPIData(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanPI(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
    	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    	at javax.xml.parsers.SAXParser.parse(Unknown Source)
    	at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
    	at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    	at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
    	at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
    	at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
    	at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
    	at org.apache.axis.client.Call.invoke(Call.java:2767)
    	at org.apache.axis.client.Call.invoke(Call.java:2443)
    	at org.apache.axis.client.Call.invoke(Call.java:2366)
    	at org.apache.axis.client.Call.invoke(Call.java:1812)
    	at localhost.Hello.HelloSOAPStub.sayHello(HelloSOAPStub.java:107)
    	at client.HelloClient.main(HelloClient.java:20)
    Pourtant le service est correctement consommé lorsque j'entre l'URL http://localhost:8080/axis/services/...ame=Christophe dans un navigateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8" ?> 
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    	<soapenv:Body>
    		<sayHelloResponse xmlns="">
    			<message>Hello Christophe !</message> 
    		</sayHelloResponse>
    	</soapenv:Body>
    </soapenv:Envelope>
    Une idée ?

    Merci à vous...

  2. #2
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut
    Il semblerait que le stub client ne doive pas être généré à partir du contrat WSDL que j'ai créé via l'assistant d'Eclipse (le client lève l'exception sus-citée), mais à partir du contrat WSDL légèrement modifié par Axis lors du déploiement du service web (dans ce cas, le client fonctionne correctement)...

    Voici le contrat WSDL modifié par Axis et accessible à l'URL http://localhost:8080/axis/services/HelloSOAP?wsdl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions targetNamespace="http://localhost:8080/Hello/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/Hello/" xmlns:intf="http://localhost:8080/Hello/" 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="http://localhost:8080/Hello/" xmlns="http://www.w3.org/2001/XMLSchema">
       <element name="sayHello">
        <complexType>
         <sequence>
          <element name="name" type="xsd:string"/>
         </sequence>
        </complexType>
       </element>
       <element name="sayHelloResponse">
        <complexType>
         <sequence>
          <element name="message" type="xsd:string"/>
         </sequence>
        </complexType>
       </element>
      </schema>
     </wsdl:types>
       <wsdl:message name="sayHelloResponse">
          <wsdl:part element="impl:sayHelloResponse" name="parameters"/>
       </wsdl:message>
       <wsdl:message name="sayHelloRequest">
          <wsdl:part element="impl:sayHello" name="parameters"/>
       </wsdl:message>
       <wsdl:portType name="Hello">
          <wsdl:operation name="sayHello">
             <wsdl:input message="impl:sayHelloRequest" name="sayHelloRequest"/>
             <wsdl:output message="impl:sayHelloResponse" name="sayHelloResponse"/>
          </wsdl:operation>
       </wsdl:portType>
       <wsdl:binding name="HelloSOAPSoapBinding" type="impl:Hello">
          <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
          <wsdl:operation name="sayHello">
             <wsdlsoap:operation soapAction="http://localhost:8080/Hello/sayHello"/>
             <wsdl:input name="sayHelloRequest">
                <wsdlsoap:body use="literal"/>
             </wsdl:input>
             <wsdl:output name="sayHelloResponse">
                <wsdlsoap:body use="literal"/>
             </wsdl:output>
          </wsdl:operation>
       </wsdl:binding>
       <wsdl:service name="Hello">
          <wsdl:port binding="impl:HelloSOAPSoapBinding" name="HelloSOAP">
             <wsdlsoap:address location="http://localhost:8080/axis/services/HelloSOAP"/>
          </wsdl:port>
       </wsdl:service>
    </wsdl:definitions>
    D'où l'affinement de ma question : pourquoi dois-je générer le stub client avec le contrat WSDL modifié par Axis et ne le puis-je pas avec le contrat WSDL que je crée avec l'assistant d'Eclipse (hormis Axis > moi...) ?

  3. #3
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut
    J'ai un peu poussé la complexité du service Hello précédent en un service HelloWSDL (histoire de les différencier) qui comporte toujours une opération sayHello mais qui prend cette fois-ci en paramètre un objet MyString qui correspond à une String limitée à 10 caractères maximum.

    Voici le contrat WSDL du nouveau service HelloWSDL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost:8080/HelloWSDL/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloWSDL" targetNamespace="http://localhost:8080/HelloWSDL/">
      <wsdl:types>
        <xsd:schema targetNamespace="http://localhost:8080/HelloWSDL/">
          <xsd:element name="sayHello">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="name" type="tns:MyString"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
     
          <xsd:element name="sayHelloResponse">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="message" type="xsd:string"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
     
          <xsd:simpleType name="MyString">
          	<xsd:restriction base="xsd:string">
          		<xsd:maxLength value="10"></xsd:maxLength>
          	</xsd:restriction>
          </xsd:simpleType>
        </xsd:schema>
      </wsdl:types>
     
      <wsdl:message name="sayHelloRequest">
        <wsdl:part element="tns:sayHello" name="parameters"/>
      </wsdl:message>
     
      <wsdl:message name="sayHelloResponse">
        <wsdl:part element="tns:sayHelloResponse" name="parameters"/>
      </wsdl:message>
     
      <wsdl:portType name="HelloWSDL">
        <wsdl:operation name="sayHello">
          <wsdl:input message="tns:sayHelloRequest"/>
          <wsdl:output message="tns:sayHelloResponse"/>
        </wsdl:operation>
      </wsdl:portType>
     
      <wsdl:binding name="HelloWSDLSOAP" type="tns:HelloWSDL">
      	<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
      	<wsdl:operation name="sayHello">
      		<soap:operation
      			soapAction="http://localhost:8080/HelloWSDL/sayHello" />
      		<wsdl:input>
      			<soap:body use="literal" />
      		</wsdl:input>
      		<wsdl:output>
      			<soap:body use="literal" />
      		</wsdl:output>
      	</wsdl:operation>
      </wsdl:binding>
     
      <wsdl:service name="HelloWSDL">
        <wsdl:port binding="tns:HelloWSDLSOAP" name="HelloWSDLSOAP">
          <soap:address location="http://localhost:8080/"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>
    Si je tente encore d'écrire un client avec le stub généré à partir de ce contrat WSDL, j'obtiens toujours la même exception
    org.xml.sax.SAXParseException: The processing instruction target matching "[xX][mM][lL]" is not allowed.
    Toutefois, je ne peux cette fois-ci pas regénérer de stub à partir du contrat WSDL modifié par Axis et disponible à l'URL http://localhost:8080/axis/services/HelloWSDLSOAP?wsdl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions targetNamespace="http://localhost:8080/HelloWSDL/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/HelloWSDL/" xmlns:intf="http://localhost:8080/HelloWSDL/" 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="http://localhost:8080/HelloWSDL/" xmlns="http://www.w3.org/2001/XMLSchema">
             <element name="sayHello">
                <complexType>
                   <sequence>
                      <element name="name" type="impl:MyString"/>
                   </sequence>
                </complexType>
             </element>
     
             <complexType name="MyString">
                <simpleContent>
                   <extension/>
                </simpleContent>
             </complexType>
     
             <element name="sayHelloResponse">
                <complexType>
                   <sequence>
                      <element name="message" type="xsd:string"/>
                   </sequence>
                </complexType>
             </element>
          </schema>
       </wsdl:types>
     
       <wsdl:message name="sayHelloResponse">
          <wsdl:part element="impl:sayHelloResponse" name="parameters"/>
       </wsdl:message>
     
       <wsdl:message name="sayHelloRequest">
          <wsdl:part element="impl:sayHello" name="parameters"/>
       </wsdl:message>
     
       <wsdl:portType name="HelloWSDL">
          <wsdl:operation name="sayHello">
             <wsdl:input message="impl:sayHelloRequest" name="sayHelloRequest"/>
             <wsdl:output message="impl:sayHelloResponse" name="sayHelloResponse"/>
          </wsdl:operation>
       </wsdl:portType>
     
       <wsdl:binding name="HelloWSDLSOAPSoapBinding" type="impl:HelloWSDL">
          <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
          <wsdl:operation name="sayHello">
             <wsdlsoap:operation soapAction="http://localhost:8080/HelloWSDL/sayHello"/>
             <wsdl:input name="sayHelloRequest">
                <wsdlsoap:body use="literal"/>
             </wsdl:input>
             <wsdl:output name="sayHelloResponse">
                <wsdlsoap:body use="literal"/>
             </wsdl:output>
          </wsdl:operation>
       </wsdl:binding>
     
       <wsdl:service name="HelloWSDL">
          <wsdl:port binding="impl:HelloWSDLSOAPSoapBinding" name="HelloWSDLSOAP">
             <wsdlsoap:address location="http://localhost:8080/axis/services/HelloWSDLSOAP"/>
          </wsdl:port>
       </wsdl:service>
    </wsdl:definitions>
    J'obtiens l'erreur suivante :
    >java org.apache.axis.wsdl.WSDL2Java HelloWSDLSOAP.wsdl
    java.lang.NullPointerException
    at org.apache.axis.wsdl.toJava.JavaBeanWriter.preprocess JavaBeanWriter.java:295)
    at org.apache.axis.wsdl.toJava.JavaBeanWriter.<init>(JavaBeanWriter.java:160)
    at org.apache.axis.wsdl.toJava.JavaTypeWriter.getBeanWriter(JavaTypeWriter.java:174)
    at org.apache.axis.wsdl.toJava.JavaTypeWriter.<init>(JavaTypeWriter.java:89)
    at org.apache.axis.wsdl.toJava.JavaGeneratorFactory.getGenerator(JavaGeneratorFactory.java:318)
    at org.apache.axis.wsdl.gen.Parser.generateTypes(Parser.java:545)
    at org.apache.axis.wsdl.gen.Parser.generate(Parser.java:432)
    at org.apache.axis.wsdl.gen.Parser.access$000(Parser.java:45)
    at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:362)
    at java.lang.Thread.run(Unknown Source)
    J'ai l'impression que le problème vient de la partie relative au type MyString :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <complexType name="MyString">
       <simpleContent>
          <extension/>
       </simpleContent>
    </complexType>
    J'ai donc essayé d'adapter cette partie à partir de la partie correspondante de mon premier contrat WSDL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <simpleType name="MyString">
       <restriction base="xsd:string">
          <maxLength value="10"></maxLength>
       </restriction>
    </simpleType>
    Cette fois, la génération du stub se déroule correctement et le client fonctionne.

    Alors utilisé-je mal le premier stub généré pour écrire mon client (j'utilise le même code avec le second contrat modifié) ?
    Axis a-t-il des problèmes pour gérer les types définis par le développeur ?
    Pourquoi dois-je corriger le contrat WSDL modifié par Axis (et surtout pourquoi ne puis-je pas utiliser mon premier contrat WSDL ?) ?
    Avec l'outil WSDL2Java d'Axis2, je n'ai aucun problème pour écrire un client qui tourne avec le stub généré à partir du premier contrat WSDL présenté ici, mais il lance quant à lui l'exception suivante pour le second contrat WSDL erroné :
    Exception in thread "main" org.apache.axis2.wsdl.codegen.CodeGenerationException: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

  4. #4
    oca
    oca est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2004
    Messages : 354
    Points : 421
    Points
    421
    Par défaut
    je me demande si il n'y a pas un bulle la dedans...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <wsdl:definitions targetNamespace="http://localhost:8080/HelloWSDL/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/HelloWSDL/" ... >
    
       <wsdl:types>
          <schema targetNamespace="http://localhost:8080/HelloWSDL/" xmlns="http://www.w3.org/2001/XMLSchema">
             <element name="sayHello">
                <complexType>
                   <sequence>
                      <element name="name" type="impl:MyString"/>
                   </sequence>
                </complexType>
             </element>
    le namespace impl n'est pas définit dans le tag "schema" je ne suis pas sur que les namespaces hérite des tags parents (dans ce cas précis, de "wsdl:definitions")... à vérifier...
    A+

  5. #5
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut
    Pour générer correctemet le stub client à partir du premier contrat WSDL (généré avec l'éditeur d'Eclipse)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost:8080/Hello/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Hello" targetNamespace="http://localhost:8080/Hello/">
      <wsdl:types>
        <xsd:schema targetNamespace="http://localhost:8080/Hello/">
          <xsd:element name="sayHello">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="name" type="xsd:string"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
     
          <xsd:element name="sayHelloResponse">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="message" type="xsd:string"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:schema>
      </wsdl:types>
     
      <wsdl:message name="sayHelloRequest">
            <wsdl:part name="parameters" element="tns:sayHello"></wsdl:part>
      </wsdl:message>
     
      <wsdl:message name="sayHelloResponse">
        <wsdl:part element="tns:sayHelloResponse" name="parameters"/>
      </wsdl:message>
     
      <wsdl:portType name="Hello">
        <wsdl:operation name="sayHello">
          <wsdl:input message="tns:sayHelloRequest"/>
          <wsdl:output message="tns:sayHelloResponse"/>
        </wsdl:operation>
      </wsdl:portType>
     
      <wsdl:binding name="HelloSOAP" type="tns:Hello">
      	<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
      	<wsdl:operation name="sayHello">
      		<soap:operation soapAction="http://localhost:8080/Hello/sayHello" />
      		<wsdl:input>
      			<soap:body use="literal" />
      		</wsdl:input>
      		<wsdl:output>
      			<soap:body use="literal" />
      		</wsdl:output>
      	</wsdl:operation>
      </wsdl:binding>
     
      <wsdl:service name="Hello">
        <wsdl:port binding="tns:HelloSOAP" name="HelloSOAP">
          <soap:address location="http://localhost:8080/"/>
        </wsdl:port>
      </wsdl:service>
    </wsdl:definitions>
    il suffit de remplacer dans la section service la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <soap:address location="http://localhost:8080/"/>
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <soap:address location="http://localhost:8080/axis/services/HelloWSDLSOAP"/>
    _________________________________________________________________


    Citation Envoyé par oca Voir le message
    je me demande si il n'y a pas un bulle la dedans...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <wsdl:definitions targetNamespace="http://localhost:8080/HelloWSDL/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/HelloWSDL/" ... >
    
       <wsdl:types>
          <schema targetNamespace="http://localhost:8080/HelloWSDL/" xmlns="http://www.w3.org/2001/XMLSchema">
             <element name="sayHello">
                <complexType>
                   <sequence>
                      <element name="name" type="impl:MyString"/>
                   </sequence>
                </complexType>
             </element>
    le namespace impl n'est pas définit dans le tag "schema" je ne suis pas sur que les namespaces hérite des tags parents (dans ce cas précis, de "wsdl:definitions")... à vérifier...
    A+
    Je pense que l'héritage a bien lieu car il n'y a aucun problème pour le premier contrat WSDL par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost:8080/HelloWSDL/" ... >
      <wsdl:types>
        <xsd:schema targetNamespace="http://localhost:8080/HelloWSDL/">
          <xsd:element name="sayHello">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="name" type="tns:MyString"/>
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
    Et même en redéfinissant le namespace impl dans le tag "schema", cela ne change rien...

    De toute façon, la définition du type MyString est manifestement erronée dans le WSDL généré par Axis (pas de type de base, pas de restriction) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <complexType name="MyString">
       <simpleContent>
          <extension/>
       </simpleContent>
    </complexType>

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut même probleme ...
    Bonjour.

    Je fais face au même probleme.
    Etant donné que la modification du soap:address fonctionne pour vous, cherchez-vous toujours à resoudre le problème de la transformation de votre type MyString dans le WSDL généré ?

    J'utilise un wsdl pour créer à la fois les classes clientes et les classes coté serveur. Ces classes serveur me permettent de créer un service "bouchon".
    Mais les classes clientes générées à partir du WSDL d'origine ne permettent pas d'acceder au service. Je tente donc de les re-generer à partir du nouveau WSDL fourni par le service bouchon, mais je rencontre le même message d'erreur que vous (WSDL2Java rencontrant une NullPointerException sur JavaBeanWriter.preprocess:295).
    Le bout de code xml qui pose probleme est exactement le même que dans votre cas : une restriction de String qui se retrouve réduite à <simpleContent> <extension/> </simpleContent>

    J'ai tenté la modification de <soap:address location="http://localhost:8080/"/> mais ca n'a rien changé. De toute façon dans mon code d'invocation, je surcharge dynamiquement le endpoint lors de l'appel du constructeur du binding stub.
    Je me dis que si ca marche pour vous et pas pour moi, cela pourrait venir de la commande Wsdl2Java ...
    Quelles options utilisez-vous pour générer ce code ?
    J'utilise ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    org.apache.axis.wsdl.toJava.Emitter emitter=new Emitter();
    // --verbose
    emitter.setVerbose(true);
    // --deployScope
    emitter.setScope(Scope.getScope("request", null));
    // --output
    emitter.setOutputDir(outputFolder);
    // --skeletonDeploy
    emitter.setSkeletonWanted(false);
    emitter.setServerSide(true);
    // --helperGen
    emitter.setHelperWanted(true);
    // override all namespace to package mappings
    if(packageName!=null) emitter.setPackageName(packageName);
    // user authentication
    Authenticator.setDefault(new DefaultAuthenticator(emitter.getUsername(), emitter.getPassword()));
     
    emitter.run(wsdl);
    Cordialement, elkar

  7. #7
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut
    Citation Envoyé par elkar Voir le message
    Bonjour.

    Je fais face au même probleme.
    Etant donné que la modification du soap:address fonctionne pour vous, cherchez-vous toujours à resoudre le problème de la transformation de votre type MyString dans le WSDL généré ?
    La modification du soap:address est à faire à partir du premier contrat WSDL (celui que j'écris avec l'assistant d'Eclipse). Dans ce cas-là, nul besoin de retoucher quoi que ce soit sur le type MyString.

    La modification que j'ai apporté à propos du type MyString intervient sur le second contrat WSDL (celui modifié par Axis lors du déploiement du service web). Dans ce cas-là, c'est le soap:address qui n'a pas besoin d'être retouché.

    Citation Envoyé par elkar Voir le message
    J'utilise un wsdl pour créer à la fois les classes clientes et les classes coté serveur. Ces classes serveur me permettent de créer un service "bouchon".
    Mais les classes clientes générées à partir du WSDL d'origine ne permettent pas d'acceder au service. Je tente donc de les re-generer à partir du nouveau WSDL fourni par le service bouchon, mais je rencontre le même message d'erreur que vous (WSDL2Java rencontrant une NullPointerException sur JavaBeanWriter.preprocess:295).
    Le bout de code xml qui pose probleme est exactement le même que dans votre cas : une restriction de String qui se retrouve réduite à <simpleContent> <extension/> </simpleContent>

    J'ai tenté la modification de <soap:address location="http://localhost:8080/"/> mais ca n'a rien changé. De toute façon dans mon code d'invocation, je surcharge dynamiquement le endpoint lors de l'appel du constructeur du binding stub.
    Je me dis que si ca marche pour vous et pas pour moi, cela pourrait venir de la commande Wsdl2Java ...
    Quelles options utilisez-vous pour générer ce code ?
    Comme je l'ai marqué auparavant, j'utilise la commande suivante :
    java org.apache.axis.wsdl.WSDL2Java Hello.wsdl
    NB : Il faut bien penser à référencer toutes les librairies d'Axis dans la variable d'environnement CLASSPATH.

    Citation Envoyé par elkar Voir le message
    De toute façon dans mon code d'invocation, je surcharge dynamiquement le endpoint lors de l'appel du constructeur du binding stub.
    Je n'ai pas saisi ce que tu voulais dire par-là, pourrais-tu expliquer davantage s'il te plaît ?

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par elkar Voir le message
    De toute façon dans mon code d'invocation, je surcharge dynamiquement le endpoint lors de l'appel du constructeur du binding stub.
    Citation Envoyé par Arnaud_03 Voir le message
    Je n'ai pas saisi ce que tu voulais dire par-là, pourrais-tu expliquer davantage s'il te plaît ?
    Par defaut, le code client Axis utilise le endpoint défini dans le fichier WSDL.
    Si on veut se connecter sur un service identique installé ailleurs, soit on change le wsdl et on genere un nouveau code client axis, soit on change dynamiquement ce endpoint dans les objets client Axis, juste avant l'invocation de l'operation.

    Je fais ceci avec le mécanisme de reflexion, qui rend le code peu lisible, mais voici en quoi ca consiste :
    - Identifier les classes client parmi les classes générées par Axis :
    Service est une interface qui hérite de javax.xml.rpc.Service
    Service Locator est une classe qui hérite de org.apache.axis.client.Service et qui implemente l'interface Service
    Stub hérite de java.rmi.Remote
    Stub Implementation hérite de org.apache.axis.client.Stub et implémente le Stub
    - Appeler le constructeur du Service Locator
    - Appeler le constructeur du Stub Implementation avec en paramètre l'url du endpoint et l'objet Service Locator casté en tant que org.apache.axis.client.Service.
    - invoquer l'operation à partir de l'objet Stub Implementation

  9. #9
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Points : 215
    Points
    215
    Par défaut
    Ok !

Discussions similaires

  1. Problème génération client web service avec CXF(wsdl2java)
    Par riadhhwajdii dans le forum Services Web
    Réponses: 0
    Dernier message: 19/06/2014, 12h04
  2. [Débutant] Client Web Service avec wsdl seul
    Par grinder59 dans le forum Langages
    Réponses: 2
    Dernier message: 21/11/2013, 13h33
  3. [1.x] fonctionnement d'un web service REST avec le client
    Par safa.nasich dans le forum Symfony
    Réponses: 0
    Dernier message: 29/06/2011, 15h33
  4. Consommer un web service C# avec un client PHP
    Par legide dans le forum Services Web
    Réponses: 4
    Dernier message: 24/12/2009, 16h54
  5. Client Web Service
    Par caro. dans le forum Services Web
    Réponses: 3
    Dernier message: 08/04/2005, 16h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo