WebOTX Manual V10.3 (第4版) 目次を表示 |
Caution
ここで紹介している方法でWebサービスをテストするには、WebOTX
Developer
のインストール時に テスト用サーバ も選択してインストールしておく必要があります。
Memo
JAX-RPCは旧互換のための機能です。
新規にSOAP Webサービスを作成する場合は、JAX-WSに準拠するサービスを作成してください。
/** * HelloService.java * * This file was auto-generated * by the Web Service Director Eclipse Plugin Edition. */ package sample.hello.helloservice; import javax.jws.WebService; @WebService(targetNamespace = "http://sample/Hello", serviceName = "HelloService") public class HelloService { //TODO: Add Operation public String say_hello(String name) { return "Hello " + name + " !"; } }ここまでで、JAX-WSに準拠するWebサービスの作成が完了しました。
Memo
配備しないままで、WSDLファイルを入手しクライアントを生成することも可能です。詳細は「WSDLファイルの生成」を参照してください。
/** * AddNumbersPortTypeImpl.java * * This file was auto-generated * by the Web Service Director Eclipse Plugin Edition. */ package org.duke; import javax.jws.WebService; @WebService(endpointInterface="org.duke.AddNumbersPortType", serviceName = "AddNumbersService") public class AddNumbersPortTypeImpl { public int addNumbers(int arg0, int arg1) { //TODO implement this method //throw new UnsupportedOperationException("Not implemented yet"); return 1; } public void oneWayInt(int arg0) { //TODO implement this method //throw new UnsupportedOperationException("Not implemented yet"); System.out.println("Service received: " + arg0); } }ここまでで、WSDLファイルからJAX-WSに準拠するWebサービスの作成が完了しました。
項目 | 値 |
---|---|
プロジェクト名 | RestSampleXML |
ターゲット・ランタイム | WebOTX Application Server v10(Local Default) |
項目 | 値 |
---|---|
JAX-RS Implementation Library | ライブラリー構成を無効 |
JAX-RS servlet class name | org.glassfish.jersey.servlet.ServletContainer |
URL マッピング・パターン | /* |
package sample.resource; public class Customer { private String lastname; private String firstname; }メニュー ソース > GetterおよびSetterの生成 を選択し、すべて選択をクリックして、OK をクリックすると、Customer.javaにGetterおよびSetterが追加されます。
package sample.resource; public class Customer { private String lastname; private String firstname; public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } }クラス名Customerを選択し、注釈プロパティービューでアノテーション@XmlRootElementを追加し、そのname属性の値を"氏名"に設定します。 同様な方法で、属性lastnameにアノテーション@XmlElement(name = "姓")を追加し、属性firstnameにアノテーション@XmlElement(name = "名")を追加し、メソッドgetLastname()及びgetFirstname()にアノテーション@XmlTransientを追加します。
package sample.resource; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; @XmlRootElement(name = "氏名") public class Customer { @XmlElement(name = "姓") private String lastname; @XmlElement(name = "名") private String firstname; @XmlTransient public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } @XmlTransient public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } }
package sample.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; import sample.resource.Customer; public class Util { public static Map<String, Customer> loadData(String datafile) { Map<String, Customer> map = new HashMap<String, Customer>(); String contents = readFile(datafile); if (contents != null) { String[] line = contents.split("\n"); for (int i = 0; i < line.length; i++) { String[] items = line[i].split(","); if (items.length == 3) { Customer customer = new Customer(); customer.setLastname(items[1]); customer.setFirstname(items[2]); map.put(items[0], customer); } } } return map; } public static String readFile(String fileName) { StringBuffer sBuffer = new StringBuffer(); BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader( Util.class.getResourceAsStream(fileName))); String tmpStr = br.readLine(); while (tmpStr != null) { sBuffer.append(tmpStr).append("\n"); tmpStr = br.readLine(); } return sBuffer.toString(); } catch (IOException e) { e.printStackTrace(); } finally { try { br.close(); } catch (Exception e) { e.printStackTrace(); } } return sBuffer.toString(); } }
0001,田中,太郎 0002,鈴木,一郎
package sample; import java.util.Map; import sample.resource.Customer; import sample.util.Util; public class CustomerResource { public Customer getCustomerList(String id) { // load data Map<String, Customer> map = Util.loadData("/sample/data/customerlist.txt"); Customer customer = map.get(id); return customer; } }クラス名CustomerResourceを選択し、注釈プロパティービューでアノテーション@Pathを追加し、そのvalue属性の値を"/name_list"に設定します。 同様な方法で、メソッドgetCustomerList()にアノテーション@Path(value = "{id}")、@GET及び@Produces(value = { "application/xml" })を追加し、パラメーター id にアノテーション@PathParam(value = "id")を追加します。
package sample; import java.util.Map; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import sample.resource.Customer; import sample.util.Util; @Path(value = "/name_list") public class CustomerResource { @Produces(value = { "application/xml" }) @GET @Path(value = "{id}") public Customer getCustomerList(@PathParam(value = "id") String id) { // load data Map<String, Customer> map = Util.loadData("/sample/data/customerlist.txt"); Customer customer = map.get(id); return customer; } }
Memo
アノテーションのvalue属性の属性名が省略できますので、以下のソースは上のソースと同等な処理を持ちます。
package sample; import java.util.Map; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import sample.resource.Customer; import sample.util.Util; @Path("/name_list") public class CustomerResource { @Produces("application/xml") @GET @Path("{id}") public Customer getCustomerList(@PathParam("id") String id) { // load data Map<String, Customer> map = Util.loadData("/sample/data/customerlist.txt"); Customer customer = map.get(id); return customer; } }ここまでで、XML で通信するJAX-RSに準拠するWebサービスの作成が完了しました。
package sample; import java.util.Map; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import sample.resource.Customer; import sample.util.Util; @Path("/name_list") public class CustomerResource { @Produces("application/json") @GET @Path("{id}") public Customer getCustomerList(@PathParam("id") String id) { // load data Map<String, Customer> map = Util.loadData("/sample/data/customerlist.txt"); Customer customer = map.get(id); return customer; } }サーバに配備については、XML で通信する場合と同様、 「WARファイルを作成します」を参照してください。
項目 | 値 |
---|---|
プロジェクト名 | RestSampleXML |
ターゲット・ランタイム | WebOTX Application Server v10(Local Default) |
項目 | 値 |
---|---|
JAX-RS 実装ライブラリー | Disable Library Configuration |
JAX-RS サーブレット・クラス名 | org.glassfish.jersey.servlet.ServletContainer |
URL マッピング・パターン | /* |
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>RestSampleXML</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>JAX-RS Servlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JAX-RS Servlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>RestSampleXML</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>JAX-RS Servlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>sample.CustomerResource</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JAX-RS Servlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
Memo
JAX-RS 2.0のリソースの登録は変わっていますので、Applicationを作成してリソースを登録するか、またはweb.xmlに明示的にリソースを指定するのが必要となります。
Memo
ここで紹介している方法でテストするには、WebOTX
Developerのインストール時に、テスト用サーバ がインストールされている必要があります。
配備したWebサービスから JAX-WS に準拠した Web サービスのクライアントを作成します。
RESTful Webサービスは、ブラウザでアクセスできますので、この手順は必要ありません。
JAX-RPCに準拠したWebサービスのクライアントは、JAX-RPCに準拠したWebサービスを作成時に既に作成されていますので、この手順は必要ありません。
JAX-WS に準拠した Web サービスのクライアントを作成するためには、Web サービス参照 機能を利用します。 Web サービス参照機能は、既存のプロジェクトに対して設定するため、まずは Java プロジェクトを作成します。
メニュー ファイル > 新規 > プロジェクト を選択して、 新規プロジェクト ダイアログを開きます。
Java プロジェクト を選択して、次へ をクリックします。
プロジェクト名 に 「wsreference」 を入力して、完了 をクリックします。
パースペクティブの変更を促すダイアログが表示される場合がありますが、いいえを選んでください。
続いて main メソッドを持つクラスを作成します。プロジェクトの右クリックメニューから 新規 > クラス をクリックします。
パッケージ に 「main」、名前 に 「Main」 を入力し、public static void main(String[] args) にチェックを入れます。
プロジェクトの右クリックメニューから、Web サービス > Web サービス参照 をクリックします。
Web サービスを新規に作成した場合は、WSDL の URL を指定して作成 に 「http://localhost/Hello/HelloService?wsdl」 を指定します。
Web サービスを WSDL から作成した場合には、WSDL の URL を指定して作成 に 「http://localhost/Hello/AddNumbersService?wsdl」 を指定します。
完了 をクリックします。
次に呼び出しコードを生成します。
生成されたプロジェクト wsreference の src フォルダ配下にある main/Main.java ファイルを開きます。
Web サービスを新規に作成した場合、プロジェクト・エクスプローラーの Web サービス参照ノード 配下の say_hello ノードを展開します。 利用したい呼び出し方式のノードを、Main.java のエディタにドラッグ&ドロップします。
図1.1.5.1-9
呼び出しコードが生成されます。以下は同期呼び出しの呼び出しコードです。
package main; public class Main { /** * @param args */ public static void main(String[] args) { try { // web service reference for HelloService sample.hello.HelloService_Service service = new sample.hello.HelloService_Service(); sample.hello.HelloService port = service.getHelloServicePort(); // TODO initialize arguments java.lang.String arg0 = ""; java.lang.String result = port.sayHello(arg0); // TODO process result System.out.println(result); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // web service reference for HelloService } }
引数を指定します。
package main; public class Main { /** * @param args */ public static void main(String[] args) { try { // web service reference for HelloService sample.hello.HelloService_Service service = new sample.hello.HelloService_Service(); sample.hello.HelloService port = service.getHelloServicePort(); // TODO initialize arguments java.lang.String arg0 = "Bob"; java.lang.String result = port.sayHello(arg0); // TODO process result System.out.println(result); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // web service reference for HelloService } }
Web サービスを WSDL から作成した場合、プロジェクト・エクスプローラーの Web サービス参照ノード 配下の addNumbers ノードを展開します。 利用したい呼び出し方式のノードを、Main.java のエディタにドラッグ&ドロップします。
呼び出しコードが生成されます。以下は同期呼び出しの呼び出しコードです。
package main; public class Main { /** * @param args */ public static void main(String[] args) { try { // web service reference for AddNumbersService org.duke.AddNumbersService service = new org.duke.AddNumbersService(); org.duke.AddNumbersPortType port = service.getAddNumbersServicePort(); // TODO initialize arguments int arg0 = 0; int arg1 = 0; int result = port.addNumbers(arg0, arg1); // TODO process result System.out.println(result); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // web service reference for AddNumbersService } }以上でクライアントの生成は完了です。次は、作成したクライアントを使用してWebサービスを実行します。「 Webサービスの実行」を参照してください。
Memo
メニュー(Webサービス > WSDLファイル生成)からWSDLファイルを生成した場合、
作成したWebサービスをアーカイブしてサーバに配備する必要があります。
「WARファイルを作成します」を参照してください。
package main; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class RestSampleClient { /** * @param args */ public static void main(String[] args) { // WebリソースのURI String requestUrl = "http://localhost/RestSampleXML/name_list/0001"; HttpURLConnection httpConn = null; URL url = null; int responseCode = -1; String responseEntity = ""; try { // 呼び出す対象のWebリソースのURIを設定する url = new URL(requestUrl); httpConn = (HttpURLConnection) url.openConnection(); // HTTPメソッドを"GET"に設定する httpConn.setRequestMethod("GET"); // 接続を開始する httpConn.connect(); responseCode = httpConn.getResponseCode(); System.out.println("the resource specified by requestUrl " + requestUrl + " returned response code: " + responseCode); BufferedReader br = new BufferedReader(new InputStreamReader( httpConn.getInputStream())); StringBuilder sBuilder = new StringBuilder(); // Webサービスからのレスポンスの読み取り String tmpResponseStr = br.readLine(); while (tmpResponseStr != null) { sBuilder.append(tmpResponseStr); tmpResponseStr = br.readLine(); } // レスポンスの表示 responseEntity = sBuilder.toString(); System.out.println("the resource specified by requestUrl " + requestUrl + " returned response entity: " + responseEntity); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <Script language="JavaScript"> <!-- var xmlHttpRequest = null; function callRS() { // リソースの URI の指定 var url = "http://localhost/RestSampleXML/name_list/0001"; if(window.XMLHttpRequest){ xmlHttpRequest=new XMLHttpRequest(); }else if(window.ActiveXObject){ xmlHttpRequest = new ActiveXObject('Msxml2.XMLHTTP'); }else { alert("未サポート"); } // 接続開始 xmlHttpRequest.open("GET",url,false); // レスポンスを処理するコールバック関数の指定 xmlHttpRequest.onreadystatechange=processResponse; xmlHttpRequest.send(null); } // レスポンスを処理するコールバック関数定義 function processResponse() { if(xmlHttpRequest.readyState == 4) { if(xmlHttpRequest.status == 200 || xmlHttpRequest.status == 201) { // リクエストの処理 // レスポンスの文字列を textarea に表示する。 window.document.testForm.responseString.value = xmlHttpRequest.responseText; }else{ // エラー処理 alert("レスポンスエラー:"+ xmlHttpRequest.readyState + ", " + xmlHttpRequest.status); } } } //--> </Script> </head> <body> <form action="・・・" method="Get" name="testForm"> <input type="button" value="test" onClick="callRS();"><br> <textarea name="responseString" rows="8" cols="40"></textarea> </form> </body> </html>
メニューから 実行 > 実行構成 をクリックします。
左の表で Javaアプリケーション を選択し、左上にある 新規の起動構成 をクリックします。名前 に「Main」を、 プロジェクト に「wsreference」 を、 メイン・クラスに「main.Main」を指定し、実行 をクリックします。 コンソールビューに、「Hello Bob !」 または 「1」と表示されれば、Webサービスのテストは完了です。
{"姓":"田中","名":"太郎"}http://localhost/Hello/name_list/0002にアクセスすると、以下の警告イメージが表示されます。 ファイルを開くを選択し、メモ帳を選択すると、id が0002のコンシューマの氏名が表示されます。
{"姓":"鈴木","名":"一郎"}
Memo
WebOTXサーバにデフォルトでJAX-RS 2.0のコンポーネントをインストールしていません。JAX-RS 2.0 準拠のWebサービスをテストする前に、以下 install-optional-component コマンドでJAX-RS 2.0 に切り替える必要があります。
otxadmin>install-optional-component --domain {domain名} --apgroup {アプリケーショングループ名} --pgroup {プロセスグループ名} jaxrs20http://localhost/Hello/name_list/0001にアクセスすると、 id が0001のコンシューマの氏名が表示されます。 http://localhost/Hello/name_list/0002にアクセスすると、 id が0002のコンシューマの氏名が表示されます。