JAX-WS:サーバー側のSOAPハンドラ

SOAPハンドラは、SOAPメッセージインターセプタであり、着信または発信SOAPメッセージを代行受信し、その値を操作できます。たとえば、クライアント側でSOAPハンドラを添付します。SOAPハンドラは、クライアントから送信されるすべての送信SOAPメッセージのSOAPヘッダーブロックにクライアントのコンピュータMACアドレスを挿入します。サーバ側では、別のSOAPハンドラを添付して、受信したすべてのSOAPメッセージからSOAPヘッダーブロック内のクライアントのMACアドレスを取り戻します。サーバー側では、公開されているサービスにアクセスできるコンピュータを特定することができます。

この記事は3つの部分に分かれています:

  1. JAX-WS:サーバー側のSOAPハンドラ. (この記事)

  2. jax-ws-jax-ws-soap-handler-in-client-side/[JAX-WS:

クライアントサイドのSOAPハンドラ]。リンク://webservices/jax-ws/jax-ws-soap-handler-testing-client-and-server-side/[JAX-WS

: SOAP handler testing for client and server side]

サーバ側のSOAPハンドラ

この記事では、SOAPハンドラを作成してサーバ側で添付して、着信SOAPメッセージからSOAPヘッダブロックのmacアドレスを取得する方法を説明します。 MACアドレス " 90-4C-E5-44-B9-8F "のコンピュータのみがこの公開されたサービスにアクセスできるように検証してください。

無効なクライアントがサービスにアクセスしようとすると、 `SOAPFaultException`をクライアントに戻します。

この例のディレクトリ構造

image、title = "jaxws-handler-server-example"、width = 367、height = 383

1. Webサービス

簡単なWebサービス。文字列を返す `getServerName()`メソッドがあります。

File:ServerInfo.java

package com.mkyong.ws;

import javax.jws.HandlerChain;
import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public class ServerInfo{

    @WebMethod
    public String getServerName() {

        return "mkyong server";

    }

}

Webサービスのデプロイメントに必要なJavaファイルを生成します。

D:\workspace-new\WebServices\bin>wsgen -keep -verbose -cp . com.mkyong.ws.ServerInfo
Note:   ap round: 1
...

com \ mkyong \ ws \ jaxws \ GetServerName.java
com \ mkyong \ ws \ jaxws \ GetServerNameResponse.java
注:ap round:2

2つのファイルが生成されます。

。 com \ mkyong \ ws \ jaxws \ GetServerName.java 。 com \ mkyong \ ws \ jaxws \ GetServerNameResponse.java

File:GetServerName.java

パッケージcom.mkyong.ws.jaxws;

import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "getServerName"、namespace = "http://ws.mkyong.com/")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "getServerName"、namespace = "http://ws.mkyong.com/")
パブリッククラスGetServerName {
}

File:GetServerNameResponse.java

パッケージcom.mkyong.ws.jaxws;

import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType;

@ XmlType(name = "getServerNameResponse"、namespace = "http://ws.mkyong.com/")@XmlAccessorType(XmlAccessType.FIELD)@ XmlType(name = "getServerNameResponse"、namespace = "http://ws.mkyong .com/")public class GetServerNameResponse {

@XmlElement(name = "return"、namespace = "")プライベートString __return;

/** **  **  **  @return ** はStringを返します。** /public String getReturn(){return this.__return; }

/** **  **  **  @param __return **  __returnプロパティの値** /public void setReturn(String __return){this.__return = __return; }

}

2. SOAPハンドラ

SOAPヘッダーブロックの値を取得するためのSOAPハンドラーを作成します。 すべての着信SOAPメッセージコードの説明については、コメントを参照してください。

File MacAddressValidatorHandler.java

パッケージcom.mkyong.handler;

import java.io.IOException; import java.util.Iterator; import java.util.Set; import javax.xml.namespace.QName; import javax.xml.soap.Node; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPFault; import javax.xml.soap.SOAPHeader; 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; import javax.xml.ws.soap.SOAPFaultException;

パブリッククラスMacAddressValidatorHandlerは、SOAPHandler <SOAPMessageContext> {

@Override public boolean handleMessage(SOAPMessageContextコンテキスト)

System.out.println( "Server:handleMessage()......");ブールisRequest =(ブール)context.get(MessageContext.MESSAGE__OUTBOUND__PROPERTY);

//for response message only, 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();                //throw exception                 generateSOAPErrMessage(soapMsg, "No SOAP header.");          }

//Get client mac address from SOAP header          Iterator it = soapHeader.extractHeaderElements(SOAPConstants.URI__SOAP__ACTOR__NEXT);                          //if no header block for next actor found? throw exception          if (it == null || !it.hasNext()){             generateSOAPErrMessage(soapMsg, "No header block for next actor.");              }                          //if no mac address found? throw exception          Node macNode = (Node) it.next();          String macValue = (macNode == null) ? null : macNode.getValue();                          if (macValue == null){               generateSOAPErrMessage(soapMsg, "No mac address in header block.");           }

//if mac address is not match, throw exception            if(!macValue.equals("90-4C-E5-44-B9-8F")){                generateSOAPErrMessage(soapMsg, "Invalid mac address, access is denied.");            }                            //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コンテキスト){System.out.println( "サーバー:handleFault()......");真を返します。 }

@Override public void close(MessageContext context){System.out.println( "サーバー:閉じる()......"); }

@Override public Set <QName> getHeaders(){System.out.println( "サーバー:getHeaders()......"); nullを返す。 (SOAPMessage msg、String reason){SOAPBody soapBody = msg.getSOAPPart()。getEnvelope()。getBody(); SOAPFault soapFault = soapBody.addFault(); soapFault.setFaultString(理由);新しいSOAPFaultExceptionをスローする(soapFault); } catch(SOAPException e){}}

}

3. SOAPハンドラXMLファイル

SOAPハンドラーXMLファイルを作成し、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.MacAddressValidatorHandler </javaee:handler-class>
    </javaee:handler>
  </javaee:handler-chain>
</javaee:handler-chains>

4. SOAPハンドラ - > Webサービスを添付します。

上記のSOAPハンドラをWebサービス `ServerInfo.java`に添付するには、 @ HandlerChain でアノテートし、SOAPハンドラファイル名を指定する 内部。

File:ServerInfo.java

パッケージcom.mkyong.ws;

import javax.jws.HandlerChain; import javax.jws.WebMethod; import javax.jws.WebService;

@WebService @HandlerChain(file = "handler-chain.xml")publicクラスServerInfo {

@WebMethod public String getServerName(){戻り "mkyongサーバー"; }

}

5. Webサービスパブリッシャー

テスト用の単純なWebサービスパブリッシャ。

パッケージcom.mkyong.endpoint; import javax.xml.ws.Endpoint; import com.mkyong.ws.ServerInfo;

//Endpoint publisher
public class WsPublisher{

    public static void main(String[]args) {
       Endpoint.publish("http://localhost:8888/ws/server", new ServerInfo());

       System.out.println("Service is published!");
    }

}

Done, please proceed on next article – Part 2 : JAX-WS – SOAP handler in client side .