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
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]