JAX-WS: gestionnaire SOAP côté client

Ceci fait partie 2 du gestionnaire SOAP JAX-WS. Dans l’article précédent - link://webservices/jax-ws/jax-ws-soap-handler-côté-serveur/[JAX-WS:

Gestionnaire SOAP côté serveur], vous avez créé un service Web et joint un gestionnaire pour extraire l’adresse MAC du client dans le bloc d’en-tête, pour chaque message SOAP entrant.

Gestionnaire SOAP côté client

Dans cet article, vous allez développer un client de service Web pour accéder au service publié dans le lien://webservices/jax-ws/jax-ws-soap-handler-in-server-side/[article précédent]et associer un gestionnaire. d’injecter l’adresse MAC du client dans le bloc d’en-tête, pour chaque message SOAP sortant envoyé par le côté client.

Structure de répertoire de cet exemple

image

1. Client de service Web

Utilise la commande wsimport pour analyser le fichier WSDL du service publié ( http://localhost : 8888/ws/server? Wsdl ) et générer tous les fichiers requis pour accéder au service.

C:\>wsimport -keep -verbose http://localhost:8888/ws/server?wsdl
parsing WSDL...

generating code...
com\mkyong\ws\GetServerName.java
com\mkyong\ws\GetServerNameResponse.java
com\mkyong\ws\ObjectFactory.java
com\mkyong\ws\ServerInfo.java
com\mkyong\ws\ServerInfoService.java
com\mkyong\ws\package-info.java

Six fichiers sont générés automatiquement, vous devrez peut-être vous intéresser uniquement à ServerInfoService.java .

File: ServerInfoService.java

@WebServiceClient(name = "ServerInfoService",
    targetNamespace = "http://ws.mkyong.com/",
    wsdlLocation = "http://localhost:8888/ws/server?wsdl")
public class ServerInfoService extends Service
{
   //......
}

Un client pour accéder au service publié. Fichier: WsClient.java

package com.mkyong.client;

import com.mkyong.ws.ServerInfo;
import com.mkyong.ws.ServerInfoService;

public class WsClient{

    public static void main(String[]args) throws Exception {

        ServerInfoService sis = new ServerInfoService();
        ServerInfo si = sis.getServerInfoPort();

        System.out.println(si.getServerName());

    }

}

2. Gestionnaire SOAP

Créez un gestionnaire SOAP pour injecter l’adresse MAC du client dans le bloc d’en-tête SOAP, pour chaque message SOAP sortant. Voir les commentaires pour l’explication du code.

Fichier: MacAddressInjectHandler.java

package com.mkyong.handler;

import java.io.IOException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Set;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPConstants;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class MacAddressInjectHandler implements SOAPHandler<SOAPMessageContext>{

   @Override
   public boolean handleMessage(SOAPMessageContext context) {

    System.out.println("Client : handleMessage()......");

    Boolean isRequest = (Boolean) context.get(MessageContext.MESSAGE__OUTBOUND__PROPERTY);

   //if this is a request, true for outbound messages, false for inbound
    if(isRequest){

    try{
        SOAPMessage soapMsg = context.getMessage();
            SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
            SOAPHeader soapHeader = soapEnv.getHeader();

           //if no header, add one
            if (soapHeader == null){
                soapHeader = soapEnv.addHeader();
            }

           //get mac address
            String mac = getMACAddress();

           //add a soap header, name as "mac address"
            QName qname = new QName("http://ws.mkyong.com/", "macAddress");
            SOAPHeaderElement soapHeaderElement = soapHeader.addHeaderElement(qname);

            soapHeaderElement.setActor(SOAPConstants.URI__SOAP__ACTOR__NEXT);
            soapHeaderElement.addTextNode(mac);
            soapMsg.saveChanges();

           //tracking
            soapMsg.writeTo(System.out);


       }catch(SOAPException e){
        System.err.println(e);
       }catch(IOException e){
        System.err.println(e);
       }

         }

      //continue other handler chain
       return true;
   }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        System.out.println("Client : handleFault()......");
        return true;
    }

    @Override
    public void close(MessageContext context) {
        System.out.println("Client : close()......");
    }

    @Override
    public Set<QName> getHeaders() {
        System.out.println("Client : getHeaders()......");
        return null;
    }

  //return current client mac address
   private String getMACAddress(){

    InetAddress ip;
    StringBuilder sb = new StringBuilder();

    try {

        ip = InetAddress.getLocalHost();
        System.out.println("Current IP address : " + ip.getHostAddress());

        NetworkInterface network = NetworkInterface.getByInetAddress(ip);

        byte[]mac = network.getHardwareAddress();

        System.out.print("Current MAC address : ");

        for (int i = 0; i < mac.length; i++) {

            sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));

        }
        System.out.println(sb.toString());

    } catch (UnknownHostException e) {

        e.printStackTrace();

    } catch (SocketException e){

        e.printStackTrace();

    }

    return sb.toString();
   }

}

3. Fichier XML du gestionnaire SOAP

Créez un fichier XML de gestionnaire SOAP et insérez votre déclaration de gestionnaire SOAP.

Fichier: handler-chain.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains
     xmlns:javaee="http://java.sun.com/xml/ns/javaee"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <javaee:handler-chain>
    <javaee:handler>
      <javaee:handler-class>com.mkyong.handler.MacAddressInjectHandler</javaee:handler-class>
    </javaee:handler>
  </javaee:handler-chain>
</javaee:handler-chains>

4. Attachez le gestionnaire SOAP → Client de service Web

Pour attacher le gestionnaire SOAP ci-dessus au client de service Web, modifiez le fichier ServerInfoService.java (généré via wsimport), annotez-le avec @ HandlerChain et spécifiez le nom du fichier de gestionnaire SOAP.

File: ServerInfoService.java

@WebServiceClient(name = "ServerInfoService",
    targetNamespace = "http://ws.mkyong.com/",
    wsdlLocation = "http://localhost:8888/ws/server?wsdl")
@HandlerChain(file="handler-chain.xml")
public class ServerInfoService extends Service
{
   //......
}

Terminé, veuillez passer à l’article suivant - lien://services Web/jax-ws/gestionnaire jax-ws-soap-handler-testing-for-client-and-side-side/côté client et serveur].

Télécharger le code source

Téléchargez-le - lien://wp-content/uploads/2011/01/JAX-WS-Handler-Example.zip[JAX-WS-Handler-Example.zip](21 Ko)

lien://tag/client/[client]lien://tag/jax-ws/[jax-ws]lien://tag/soap/[soap]lien://tag/web-services/[services web]