【Java】【JAX-WS】 Webサービス / Metro [7] ~ SOAPログを出力する ~

■ はじめに

 * Metro(ってゆーかーJAX-WS)で作成したWebサービスおよびそのクライアントで、
   SOAPログ(リクエスト、レスポンス)を出力する

■ 解決策

サーバ側

https://metro.java.net/guide/ch02.html#dumping-soap-messages-on-server
System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
http://itdoc.hitachi.co.jp/manuals/link/has_v1000/0344201D/com_sun_xml_ws_transport_http_httpadapter_dump.htm

クライアント側

https://metro.java.net/guide/ch02.html#dumping-soap-messages-on-client
System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");

■ サンプル

サーバサイドの実装

 * 以下の関連記事をベースに実装する
http://blogs.yahoo.co.jp/dk521123/36139336.html
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlElement;

@WebService(name = "SampleWebService")
public class SampleWebService {

  static {
    // ★ここ★
    System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
  }

  @WebMethod
  public String sayYourAge(@XmlElement(required = true, nillable = false) @WebParam(name = "name") String name,
      @XmlElement(required = false, nillable = true) @WebParam(name = "age") Long age) {
    return name + "'s age is " + age + ".";
  }
}

クライアントサイドの実装

 * 以下の関連記事をベースに実装する
http://blogs.yahoo.co.jp/dk521123/36140561.html
import java.net.URL;

public class Main2 {

  public static void main(String[] args) {
    System.out.println("Start!");

    // ★ここ★
    System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");

    try {
      URL url = new URL("http://localhost:8080/SampleWebService/services/SampleWebService.ws?wsdl");
      SampleWebServiceService service = new SampleWebServiceService(url);
      SampleWebService proxy = service.getSampleWebServicePort();

      String result = proxy.sayYourAge("Ken", 11L);

      System.out.println("Result : " + result);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
    System.out.println("Done");
  }
}

■ 出力結果

サーバ側

---[HTTP request]---
accept: text/xml, multipart/related
connection: keep-alive
content-length: 220
content-type: text/xml; charset=utf-8
host: localhost:8080
soapaction: "http://webservice.sample.com/SampleWebService/sayYourAgeRequest"
user-agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#8c29a9a53251ff741fca1664a8221dc876b2eac8
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> xmlns:ns2="Ken11--------------------">http://webservice.sample.com/">Ken11--------------------

---[HTTP response 200]---
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> xmlns:ns2="Ken's">http://webservice.sample.com/">Ken's age is 11.</return></ns2:sayYourAgeResponse></S:Body></S:Envelope>--------------------

クライアント側

Start!
---[HTTP request - http://localhost:8080/SampleWebService/services/SampleWebService.ws]---
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://webservice.sample.com/SampleWebService/sayYourAgeRequest"
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#8c29a9a53251ff741fca1664a8221dc876b2eac8
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> xmlns:ns2="Ken11--------------------">http://webservice.sample.com/">Ken11--------------------

---[HTTP response - http://localhost:8080/SampleWebService/services/SampleWebService.ws - 200]---
null: HTTP/1.1 200
Content-Type: text/xml;charset=utf-8
Date: Mon, 21 Nov 2016 13:33:26 GMT
Transfer-Encoding: chunked
<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> xmlns:ns2="Ken's">http://webservice.sample.com/">Ken's age is 11.</return></ns2:sayYourAgeResponse></S:Body></S:Envelope>--------------------

Result : Ken's age is 11.
Done

参考文献

http://stackoverflow.com/questions/1945618/tracing-xml-request-responses-with-jax-ws
より抜粋

System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");

関連記事

Webサービス / Metro [1] ~入門編 / サーバサイドの構築 ~

http://blogs.yahoo.co.jp/dk521123/36139336.html

Webサービス / Metro [2] ~入門編 / クライアントサイドの構築 ~

http://blogs.yahoo.co.jp/dk521123/36140561.html

【Axis2】【JAX-WS】 Webサービス のログファイルを出力させるには...

http://blogs.yahoo.co.jp/dk521123/32151526.html

SSLログ や SOAPログ などのコンソールログをファイル出力に変更するには...

http://blogs.yahoo.co.jp/dk521123/36689096.html