JAX-WS: обработчик SOAP на стороне клиента

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

Related