トップ 差分 一覧 ソース 置換 検索 ヘルプ PDF 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.作成したファイルを利用して、サービスを利用する

1
2
3
4
5
6
7
8
9
10
11
12
13
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

 動的にエンドポイントアドレスを変更する方法

アノテーションで

1
2
 @WebServiceRef(wsdlLocation = "http://localhost:8080/hoge?wsdl")
 private static TestServiceService service

とするとできるらしいが、うまくいかない。

その場合は、

1
TestServiceService service =  new TestServiceService(new URL("http://localhost:8080/hoge?wsdl"),new QName("http://test/", "TestServiceService"));

Java7以降は、

1
 TestServiceService service = new TestServiceService(new URL("http://localhost:8080/hoge?wsdl"));

でもOK.。
その後で、

((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://localhost:8080/test");

でアドレスを変更(たぶん、しなくてもすでに変わっていると思うけど・・・)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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をダウンロードする。
axis-bin-1_4.zip(455)

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 %*

呼び出し

流れとしては

  1. Locatorを生成
  2. Locator#getサービス(new URL(エンドポイント)) でサービスを取得

サービスの関数呼び出し

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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)を作成

1
2
3
4
5
6
7
8
9
10
11
12
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 のランチャーを作成

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
9
10
11
12
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


[カテゴリ: プログラミング言語 > Java]

[通知用URL]



  • Hatenaブックマークに追加
  • livedoorクリップに追加
  • del.icio.usに追加
  • FC2ブックマークに追加

最終更新時間:2016年09月21日 23時16分34秒