|
|
WebOTX Manual V11.1 (第6版) 目次を表示 |
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サービスの作成が完了しました。




/**
* 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 v11.1(Local Default) |



| 項目 | 値 |
|---|---|
| JAX-RS 実装ライブラリー | ライブラリー構成を無効 |
| Update Deployment Descriptor | ON |
| 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://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.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>
<description>JAX-RS Tools Generated - Do not modify</description>
<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>
package sample.resource;
public class Customer {
private String lastname;
private String firstname;
}
メニュー ソース > GetterおよびSetterの生成 を選択し、すべて選択をクリックして、生成 をクリックすると、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属性の値を"氏名"に設定します。

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), "SJIS"));
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"に設定します。

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 version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.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>
<description>JAX-RS Tools Generated - Do not modify</description>
<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>
ここまでで、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;
}
}
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();
}
}
サーバに配備については、XML で通信する場合と同様、
「WARファイルを作成します」を参照してください。












Memo
ここで紹介している方法でテストするには、WebOTX
Developerのインストール時に、テスト用サーバ がインストールされている必要があります。


<soap:address location="http://localhost/HelloService/HelloService">
次は、生成されたWSDLファイルを使用しWebサービスクライアントを作成します。
配備したWebサービスから JAX-WS に準拠した Web サービスのクライアントを作成します。
RESTful Webサービスは、ブラウザでアクセスできますので、この手順は必要ありません。
JAX-RPCに準拠したWebサービスのクライアントは、JAX-RPCに準拠したWebサービスを作成時に既に作成されていますので、この手順は必要ありません。
JAX-WS に準拠した Web サービスのクライアントを作成するためには、Web サービス参照 機能を利用します。 Web サービス参照機能は、既存のプロジェクトに対して設定するため、まずは Java プロジェクトを作成します。
メニュー ファイル > 新規 > プロジェクト を選択して、 新規プロジェクト ダイアログを開きます。

Java プロジェクト を選択して、次へ をクリックします。

プロジェクト名 に 「wsreference」 を入力して、終了 をクリックします。

modules-info.javaの作成ダイアログが表示される場合がありますが、作成しないを選んでください。

パースペクティブの変更を促すダイアログが表示される場合がありますが、いいえを選んでください。

続いて main メソッドを持つクラスを作成します。プロジェクトの右クリックメニューから 新規 > クラス をクリックします。

パッケージ に 「main」、名前 に 「Main」 を入力し、public static void main(String[] args) にチェックを入れます。

プロジェクトの右クリックメニューから、Web サービス > Web サービス参照 をクリックします。

Web サービスを新規に作成した場合(サーバに配備済み)は、WSDL の URL を指定して作成 に 「http://localhost/HelloService/HelloService?wsdl」 を指定してから 終了 をクリックします。
Web サービスを WSDL から作成した場合には、WSDL の URL を指定して作成 に 「http://localhost/HelloService_wsdl/AddNumbersService?wsdl」 を指定してから 終了 をクリックします。

Web サービスを新規に作成した場合(サーバに配備していない)は、ワークスペース内のWSDLから作成 に 「WSDLファイルの生成」で作成した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
「WSDLファイルの生成」でWSDLファイルを生成した場合、
作成したWebサービスをアーカイブしてサーバに配備する必要があります。
「WARファイルを作成します」を参照してください。
package main;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class RestSampleClient {
public static void main(String[] args) {
// WebリソースのURI
String requestUrl = "http://localhost/RestSampleXML/name_list/0001";
// クライアントオブジェクトnの作成
Client client = ClientBuilder.newClient();
// Webリソースを特定
WebTarget target = client.target(requestUrl);
// HTTPリクエストを作成
Invocation.Builder invocationBuilder = target.request(MediaType.APPLICATION_XML);
// HTTPレスポンスオブジェクトを取得
Response response = invocationBuilder.get();
// レスポンスの表示
System.out.println(response.readEntity(String.class));
// レスポンスオブジェクトの終了
response.close();
}
}
<!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サービスのテストは完了です。



{"firstname":"太郎","lastname":"田中"}
http://localhost/RestSampleXML/name_list/0002にアクセスすると、
id が0002のコンシューマの氏名が表示されます。
{"firstname":"一郎","lastname":"鈴木"}
