トップ 一覧 置換 検索 ヘルプ RSS ログイン

JavaでSOAPの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!クライアント
!!WSDLから関連クラスを生成する方法
!手順
1.WSDL から 必要なファイルを作成
2.作成したファイルを利用して、サービスを利用する

!1.WSDL から 必要なファイルを作成
サーバのサービスを起動した状態で以下を実行
 wsimport -d client http://localhost:8080/test?wsdl
または、
 wsimport -keep -d client http://localhost:8080/test?wsdl
-keep オプションでソースを残せる

!2.作成したファイルを利用して、サービスを利用する
{{code Java,
import test.TestService;
import test.TestServiceService;

public class TestClient {
  public static void main(String[] args){
    //クラスに Service が付くのでクラス名はちゃんと考えたほうがいい
    TestServiceService service = new TestServiceService();
    TestService port = service.getTestServicePort();
    
    String result = port.test001(10);
    System.out.println(result);
  }
}
}}
 javac -cp client;. TestClient.java
実行は
 java -cp client;. TestClient

!!動的にエンドポイントアドレスを変更する方法
アノテーションで
{{code Java,
 @WebServiceRef(wsdlLocation = "http://localhost:8080/hoge?wsdl")
 private static TestServiceService service
}}
とするとできるらしいが、うまくいかない。

その場合は、
{{code Java,
TestServiceService service =  new TestServiceService(new URL("http://localhost:8080/hoge?wsdl"),new QName("http://test/", "TestServiceService"));
}}
Java7以降は、
{{code Java,
 TestServiceService service = new TestServiceService(new URL("http://localhost:8080/hoge?wsdl"));
}}
でもOK.。
その後で、
 ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://localhost:8080/test");
でアドレスを変更(たぶん、しなくてもすでに変わっていると思うけど・・・)

{{code Java,
import test.TestService;
import test.TestServiceService;

import javax.xml.namespace.QName;
import javax.xml.ws.WebServiceRef;
import javax.xml.ws.BindingProvider;
import java.net.URL;

public class TestClient {
  
  public static void main(String[] args){
    try {
      TestServiceService service =  new TestServiceService(new URL("http://localhost:8080/test?wsdl"),new QName("http://test/", "TestServiceService"));
      // TestServiceService service = new TestServiceService(new URL("http://localhost:8080/test?wsdl"));
      
      TestService port = service.getTestServicePort();
      ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://localhost:8080/test");
      System.out.println(((BindingProvider)port).getRequestContext().get("javax.xml.ws.service.endpoint.address"));
      
      String result = port.test001(100);
      
      System.out.println(result);
    } catch (Exception e){
      e.printStackTrace();
    }
    
  }
}
}}


!!JAX-WS (WSDL) のバージョンが古い場合
サーバが提供するWSDLのバージョンが古い場合、 wsimport を実行すると
 use="encoded"がサポートされていない
等のメッセージが表示されることがある。
その場合は、 Apache Axis 1(1.4 Final)を使う。

!準備
http://archive.apache.org/dist/ws/axis/1_4/
からaxis 1.4をダウンロードする。
{{ref axis-bin-1_4.zip}}

!WSDLからJavaの生成
lib以下のjarにクラスパスを通して、 org.apache.axis.wsdl.WSDL2Java を実行する。
 java org.apache.axis.wsdl.WSDL2Java http://langrid.org/service_manager/wsdl/kyoto1.langrid:KyotoUJServer?wsdl

バッチを作るなら以下の様な感じ
  @echo off
  setlocal
  
  set base=%~dp0
  
  set CLASSPATH=%base%/lib
  set CLASSPATH=%CLASSPATH%;%base%/lib/axis-ant.jar
  set CLASSPATH=%CLASSPATH%;%base%/lib/axis.jar
  set CLASSPATH=%CLASSPATH%;%base%/lib/commons-discovery-0.2.jar
  set CLASSPATH=%CLASSPATH%;%base%/lib/commons-logging-1.0.4.jar
  set CLASSPATH=%CLASSPATH%;%base%/lib/jaxrpc.jar
  set CLASSPATH=%CLASSPATH%;%base%/lib/log4j-1.2.8.jar
  set CLASSPATH=%CLASSPATH%;%base%/lib/saaj.jar
  set CLASSPATH=%CLASSPATH%;%base%/lib/wsdl4j-1.5.1.jar
  
  java org.apache.axis.wsdl.WSDL2Java %*

!呼び出し
流れとしては
+Locatorを生成
+Locator#getサービス(new URL(エンドポイント)) でサービスを取得
サービスの関数呼び出し

{{code Java,
import java.net.URL;
import org.apache.axis.client.Stub;
import Translation.nlp.nict.servicetype.Kyoto1LangridKyotoUJServerLocator;
import Translation.nlp.nict.servicetype.TranslationService;

public class Test{
  public static void main(String[] args) throws Exception{

    // Translation
    Kyoto1LangridKyotoUJServerLocator jserverLoc = 
      new Kyoto1LangridKyotoUJServerLocator();
    TranslationService transService = jserverLoc.getTranslation(
      new URL("Input endpoint URL"));
    Stub stub = (Stub)transService;
    stub.setUsername("Your temporary ID or Language Grid ID");
    stub.setPassword("Your temporary password or Language Grid password");
    String ret = transService.translate("en", "ja", "Hello.");
    System.out.println(ret);

  }
}
}}

!!!サーバ
大きく以下の二通りの方法がある。
・プログラム単体でWebサーバの役割も担う方法
・Tomcatを利用する方法

!!プログラムでサーバを立てる方法
http://itpro.nikkeibp.co.jp/article/COLUMN/20080801/311972/
http://unageanu.hatenablog.com/entry/20090722/1248257955

!手順
1.呼び出されるクラス(WebService)とメソッド(WebMethod)を作成
2.WSDLに必要なファイルを作成 ※この手順を省くと実行時に自動で作成するみたい
3.WebService のランチャーを作成

!1.呼び出されるクラス(WebService)とメソッド(WebMethod)を作成
{{code Java,
package test;

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

@WebService
public class TestService {
  @WebMethod
  public String test001(int i){
    return "引数は " + i + " です。";
  }
}
}}
 javac -d server TestService.java

!2.WSDLに必要なファイルを作成
 wsgen -d server -cp server test.TestService
または、
 wsgen -keep -d server -cp server test.TestService
-keep オプションでソースファイルを残せる


!3.WebService のランチャーを作成
{{code Java,
package test;

import javax.xml.ws.Endpoint;

public class ServiceLuncher {
  public static void main(String[] args){
    Endpoint.publish("http://localhost:8080/test",new TestService());
  }
}
}}
 javac -d server -cp server ServiceLuncher.java
サービスを起動するには
 java -cp server test.ServiceLuncher


!!Tomcatを利用する方法
http://kenichiro22.hatenablog.com/entry/20101015/1287130478
http://tdottjpn.blogspot.jp/2008/06/tomcatwebservice.html
http://www.melange.co.jp/blog/?p=1491

!Tomcatに必要なライブラリの準備
TomcatでSOAPのサービスを提供するにはライブラリが必要。
いくつか種類があるが、ここでは Metro を使う。
他にも CXFやAxis2などがある。
比較は以下のURL参照。
http://www.ibm.com/developerworks/jp/java/library/j-jws14/

Metroのダウンロード
https://metro.java.net/

MetroをTomcatに組み込む
 catalina.sh stop
 ant -Dtomcat.home=<TOMCAT_INSTALL_DIR> -f <METRO_INSTALL_DIR>/metro-on-tomcat.xml install
 catalina.sh start
TOMCAT_HOME/shared/lib以下にファイルがコピーされる。
*webservices-tools.jar
*webservices-extra.jar
*webservices-extra-api.jar
*webservices-rt.jar
もし、tomcatに組み込みたくない場合は各アプリの WEB-INF/lib の中に上記のjarファイルをコピーしてもよい。

!ファイル構成
    └─WEB-INF
        │  web.xml
        │  sun-jaxws.xml
        │
        ├─classes
        │  └─test
        │          TestService.class
        │
        └─lib(このファイルは前述の通り、必要に応じて)
                webservices-extra-api.jar
                webservices-extra.jar
                webservices-rt.jar
                webservices-tools.jar

!web.xml
  <!DOCTYPE web-app PUBLIC
  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd" >
  
  <web-app>
    <display-name>JAX-WS Sample Application</display-name>
    <listener>
      <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
    </listener>
    <servlet>
      <servlet-name>jax-ws Test</servlet-name>
      <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>jax-ws Test</servlet-name>
      <url-pattern>*.ws</url-pattern>
    </servlet-mapping>
  </web-app>
!sun-jaxws.xml
  <?xml version="1.0" encoding="UTF-8"?>
  <endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
    <endpoint implementation="test.TestService" name="TestService" url-pattern="/test.ws"/>
  </endpoints>

!TestService.java
{{code Java,
package test;

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

@WebService
public class TestService {
  @WebMethod
  public String test001(int i){
    return "引数は " + i + " です。";
  }
}
}}

!wsdlの確認
tomcatにアクセスして、wsdlが取得できるか確認する。
 http://localhost:8080/soap/test.ws
URLのsoapの部分はtomcatの設定次第。環境によって変わる。

!!!WS-Security
http://www.ibm.com/developerworks/jp/java/library/j-jws13.html


{{category2 プログラミング言語,Java}}