JAX-WS:サーバー側のSOAPハンドラ
SOAPハンドラは、SOAPメッセージインターセプタであり、着信または発信SOAPメッセージを代行受信し、その値を操作できます。たとえば、クライアント側でSOAPハンドラを添付します。SOAPハンドラは、クライアントから送信されるすべての送信SOAPメッセージのSOAPヘッダーブロックにクライアントのコンピュータMACアドレスを挿入します。サーバ側では、別のSOAPハンドラを添付して、受信したすべてのSOAPメッセージからSOAPヘッダーブロック内のクライアントのMACアドレスを取り戻します。サーバー側では、公開されているサービスにアクセスできるコンピュータを特定することができます。
この記事は3つの部分に分かれています:
-
JAX-WS:サーバー側のSOAPハンドラ. (この記事)
-
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`をクライアントに戻します。
この例のディレクトリ構造
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
.
Download Source Code
Download It –
JAX-WS-Handler-Example.zip
(21KB)