Это вторая часть обработчика SOAP JAX-WS. В предыдущей статье - ссылка://webservices/jax-ws/jax-ws-мыло-обработчик на стороне сервера/[JAX-WS:
SOAP-обработчик на стороне сервера], вы создали веб-сервис и подключили обработчик для получения MAC-адреса клиента в блоке заголовка для каждого входящего SOAP-сообщения.
Обработчик SOAP на стороне клиента
В этой статье вы разработаете клиент веб-службы для доступа к опубликованному сервису по ссылке://webservices/jax-ws/jax-ws-soap-handler-in-server-side/[предыдущая статья]и прикрепите обработчик внедрить MAC-адрес клиента в блок заголовка для каждого исходящего SOAP-сообщения, отправляемого клиентской стороной.
Структура каталогов этого примера
Изображение://wp-content/uploads/2011/01/jaxws-handler-client-example.png[изображение, название = "JAXWS-обработчик-клиент-пример", ширина = 351, высота = 364]
1. Клиент веб-службы
Использует команду wsimport для анализа опубликованного WSDL-файла службы ( http://localhost : 8888/ws/server? Wsdl ) и создания всех необходимых файлов для доступа к службе.
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
Шесть файлов создаются автоматически, вам может потребоваться только обратиться к
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 { //...... }
Клиент для доступа к опубликованному сервису. File: 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. Обработчик SOAP
Создайте обработчик SOAP для внедрения MAC-адреса клиента в блок заголовка SOAP для каждого исходящего сообщения SOAP. Смотрите комментарии для объяснения кода.
File: 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. XML-файл обработчика SOAP
Создайте XML-файл обработчика SOAP и поместите объявление обработчика SOAP.
File: 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. Присоедините SOAP-обработчик → Клиент веб-службы
Чтобы прикрепить описанный выше обработчик SOAP к клиенту веб-службы, отредактируйте файл
ServerInfoService.java
(созданный с помощью wsimport), добавьте аннотацию с помощью
@ HandlerChain
и укажите имя файла обработчика 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 { //...... }
Готово, перейдите к следующей статье - ссылка://webservices/jax-ws/jax-ws-soap-handler-testing-for-client-and-server-side/[Часть 3: JAX-WS - SOAP-тестирование клиентская и серверная сторона.
Скачать исходный код
Загрузить его - ссылка://wp-content/uploads/2011/01/JAX-WS-Handler-Example.zip[JAX-WS-Handler-Example.zip](21 КБ)
ссылка://тег/клиент/[клиент]ссылка://тег/jax-ws/[jax-ws]ссылка://тег/мыло/[мыло]ссылка://тег/веб-сервисы/[веб-сервисы]