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 :

[Metro] Client d'un service web avec WS-ReliableMessaging


Sujet :

Services Web Java

  1. #1
    Membre expérimenté
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Par défaut [Metro] Client d'un service web avec WS-ReliableMessaging
    Bonjour,

    J'ai utilisé JAX-WS RI et WSIT pour déployer sur un serveur d'applications GlassFish v2 un service web HelloWSRM avec WS-ReliableMessaging.

    Voici le contrat WSDL de ce service :
    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
    <?xml version='1.0' encoding='UTF-8'?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.4-hudson-208-. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.4-hudson-208-. -->
    <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://service/" name="HelloWSRMService">
        <ns1:Policy xmlns:ns1="http://schemas.xmlsoap.org/ws/2004/09/policy" wsu:Id="HelloWSRMPortBindingPolicy">
            <ns1:ExactlyOne>
                <ns1:All>
                    <ns2:RMAssertion xmlns:ns2="http://schemas.xmlsoap.org/ws/2005/02/rm/policy" />
                    <ns3:Ordered xmlns:ns3="http://sun.com/2006/03/rm" />
                    <ns4:UsingAddressing xmlns:ns4="http://www.w3.org/2006/05/addressing/wsdl" />
                </ns1:All>
            </ns1:ExactlyOne>
        </ns1:Policy>
     
        <types>
            <xsd:schema>
                <xsd:import namespace="http://service/" schemaLocation="http://localhost:8080/HelloWSIT/HelloWSRMService?xsd=1" />
            </xsd:schema>
        </types>
     
        <message name="sayHello">
            <part name="parameters" element="tns:sayHello" />
        </message>
     
        <message name="sayHelloResponse">
            <part name="parameters" element="tns:sayHelloResponse" />
        </message>
     
        <portType name="HelloWSRM">
            <operation name="sayHello">
                <input message="tns:sayHello" />
                <output message="tns:sayHelloResponse" />
            </operation>
        </portType>
     
        <binding name="HelloWSRMPortBinding" type="tns:HelloWSRM">
            <ns5:PolicyReference xmlns:ns5="http://schemas.xmlsoap.org/ws/2004/09/policy" URI="#HelloWSRMPortBindingPolicy" />
            <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />
            <operation name="sayHello">
                <soap:operation soapAction="" />
                <input>
                    <soap:body use="literal" />
                </input>
                <output>
                    <soap:body use="literal" />
                </output>
            </operation>
        </binding>
     
        <service name="HelloWSRMService">
            <port name="HelloWSRMPort" binding="tns:HelloWSRMPortBinding">
                <soap:address location="http://localhost:8080/HelloWSIT/HelloWSRMService" />
            </port>
        </service>
    </definitions>
    Lorsque je teste le service HelloWSRM avec la console d'administration de GlassFish à l'URL http://localhost:8080/HelloWSIT/HelloWSRMService?tester, le header relatif à WS-Addressing et WS-ReliableMessaging est bien inséré dans la requête SOAP :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Header>
            <To xmlns="http://www.w3.org/2005/08/addressing">http://localhost:8080/HelloWSIT/HelloWSRMService</To>
            <Action xmlns="http://www.w3.org/2005/08/addressing">http://service/HelloWSRM/sayHelloRequest</Action>
            <ReplyTo xmlns="http://www.w3.org/2005/08/addressing">
                <Address>http://www.w3.org/2005/08/addressing/anonymous</Address>
            </ReplyTo>
            <MessageID xmlns="http://www.w3.org/2005/08/addressing">uuid:e7cac55e-c69c-4769-9950-850c60e0b00b</MessageID>
            <ns3:Sequence xmlns:ns2="http://www.w3.org/2005/08/addressing" xmlns:ns3="http://schemas.xmlsoap.org/ws/2005/02/rm" xmlns:ns4="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:ns5="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns6="http://schemas.microsoft.com/ws/2006/05/rm">
                <ns3:Identifier>uuid:8732c10a-fdf4-459e-8a5a-b1b07fe88ca3</ns3:Identifier>
                <ns3:MessageNumber>1</ns3:MessageNumber>
            </ns3:Sequence>
            <ns3:SequenceAcknowledgement xmlns:ns2="http://www.w3.org/2005/08/addressing" xmlns:ns3="http://schemas.xmlsoap.org/ws/2005/02/rm" xmlns:ns4="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:ns5="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns6="http://schemas.microsoft.com/ws/2006/05/rm">
                <ns3:Identifier>uuid:24377d2a-a3a7-42cf-a719-da1d31f92205</ns3:Identifier>
                <ns3:AcknowledgementRange Lower="0" Upper="0"/>
            </ns3:SequenceAcknowledgement>
        </S:Header>
        <S:Body>
            <ns2:sayHello xmlns:ns2="http://service/">
                <name>Christophe</name>
            </ns2:sayHello>
        </S:Body>
    </S:Envelope>
    De même, tout se passe bien lorsque je crée une servlet cliente.

    Par contre, si j'utilise une application Java en tant que client, aucun header n'est inséré dans la requête SOAP et l'exception suivant est levée :
    Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: A required header representing a Message Addressing Property is not present
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:187)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:108)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:254)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:224)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:117)
    at $Proxy29.sayHello(Unknown Source)
    at hellowsrmclient.Main.main(Main.java:12)
    Voici la réponse SOAP dans ce cas :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
        <S:Header>
            <FaultDetail xmlns="http://www.w3.org/2005/08/addressing">
                <ProblemHeaderQName>{http://www.w3.org/2005/08/addressing}Action</ProblemHeaderQName>
            </FaultDetail>
        </S:Header>
        <S:Body>
            <SOAP-ENV:Fault xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
                <faultcode
                    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns0="http://www.w3.org/2005/08/addressing">ns0:MessageAddressingHeaderRequired</faultcode>
                <faultstring>A required header representing a Message Addressing Property is not present</faultstring>
            </SOAP-ENV:Fault>
        </S:Body>
    </S:Envelope>
    Voici le code de la servlet :
    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
        @WebServiceRef(wsdlLocation = "http://localhost:8080/HelloWSIT/HelloWSRMService?WSDL")
        private HelloWSRMService service;
     
        protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
     
            try {
                out.println("<html>");
                out.println("<head>");
                out.println("<title>Servlet HelloWSRMServlet</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("<h1>Servlet HelloWSRMServlet at " + request.getContextPath() + "</h1>");
     
                service.HelloWSRM port = service.getHelloWSRMPort();
                ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:4040/HelloWSIT/HelloWSRMService");
                String name = "Christophe";
                String message = port.sayHello(name);
                out.println(message);
                out.println("</body>");
                out.println("</html>");
            } finally {
                out.close();
            }
        }
    Voici le code du main de l'application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            service.HelloWSRMService service = new service.HelloWSRMService();
            service.HelloWSRM port = service.getHelloWSRMPort();
            ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:4040/HelloWSIT/HelloWSRMService");
            String name = "Christophe";
            String message = port.sayHello(name);
     
            System.out.println(message);
     
            ((Closeable)port).close();
    Si vous savez comment faire en sorte que l'application Java puisse correctement consommer le servce web avec WS-ReliableMessaging, je suis preneur...

    Merci à vous.

    NB : J'ai également utilisé JAX-WS RI (avec NetBeans) pour générer le client à partir du contrat WSDL du service.

  2. #2
    Membre Expert
    Avatar de alexismp
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 503
    Par défaut
    Java SE 6 intègre JAX-WS qui est un sous-ensemble de Metro (il manque WSIT). Donc pas de WS-RM dans Java SE 6.

  3. #3
    Membre expérimenté
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Par défaut
    Citation Envoyé par alexismp Voir le message
    Java SE 6 intègre JAX-WS qui est un sous-ensemble de Metro (il manque WSIT). Donc pas de WS-RM dans Java SE 6.
    Mais alors comment utiliser WS-RM côté client ?

    D'autant que je ne vois pas en quoi cela répond à ma question puisque WS-RM est utilisé côté serveur et avec la servlet cliente dans les mêmes configurations que pour l'application cliente...

  4. #4
    Membre Expert
    Avatar de alexismp
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 503
    Par défaut
    WS-RM doit être présent coté client et serveur.
    Tu peux soit utiliser une servlet (le conteneur web a accès à WSIT) soit rajouter WSIT au JDK.

  5. #5
    Membre expérimenté
    Inscrit en
    Juin 2008
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 207
    Par défaut
    Cela fonctionne, merci beaucoup !

    Comme WSIT était directement directement accessible à la création d'un service web avec NetBeans, je pensais que c'était le cas quel que soit le projet. Il suffisait d'ajouter les jar de WSIT à mon projet client...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/04/2012, 19h55
  2. Service Web avec Axis et types complexes.
    Par Skyman37 dans le forum Services Web
    Réponses: 17
    Dernier message: 13/01/2011, 09h28
  3. deployer un service web avec axis 1.4 et websphere
    Par leo13 dans le forum Websphere
    Réponses: 1
    Dernier message: 10/05/2007, 10h45
  4. Déployer un service web avec weblogic 5.1
    Par karimspace dans le forum Weblogic
    Réponses: 1
    Dernier message: 13/02/2007, 17h49
  5. services web avec builder 6
    Par Seb des Monts dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/11/2006, 10h18

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