Это вторая часть обработчика 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]ссылка://тег/мыло/[мыло]ссылка://тег/веб-сервисы/[веб-сервисы]