JAX-RSを活用して、JavaクラスをWebサービス化しよう:特集:JAX-RS入門(3/4 ページ)
JAX-RSを使用すると、通常のJavaクラスをいとも簡単にWebサービス化できる。本稿では、ごく簡単なJavaプログラムを例に、その方法とJAX-RSの動作について解説する。
アノテーションの組み込み
TomcatとJerseyのインストールができたら、再度Add.javaファイルに戻ってアノテーションを組み込む。
JAX-RSのアノテーションは、javax.ws.rsネームスペースにある。
以下では、Webブラウザーのアドレスバーに対して、「http://IPアドレス:ポート/calc/add?x=n&y=m」と打ち込むと「n+m」の結果が表示されるようにしているが、アノテーションを利用してGETメソッドではなくPOSTメソッドを利用したり、引数や戻り値をXMLやJSONで与えたりもできる。アノテーションの種類や詳細な機能については、本記事の末尾に参考文献を示すのでそれを参照してほしい。強調書体で示したのがアノテーションだ。
package com.example;
import java.math.BigDecimal;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
@Path("add") // クラスをHTTPでアクセスするためのパス名を指定する
public class Add {
@GET // この例ではHTTPのGETメソッドでアクセスできるようにする
@Produces(MediaType.TEXT_PLAIN) // 結果をWebブラウザーで表示したいのでプレーンテキストを出力するように指定する
public String add(@QueryParam("x") String ax, @QueryParam("y") String ay) { // 引数をクエリーストリングで指定するための名前を指定する
BigDecimal x = new BigDecimal(ax);
BigDecimal y = new BigDecimal(ay);
return x.add(y).toString();
}
public static void main(String[] args) { // そのまま残しておいて問題ない
Add a = new Add();
System.out.println(a.add(args[0], args[1]));
}
}
ここで使っているアノテーションについてざっくりと説明をすると次のようになる。
- @Path: パスの指定。これにより「http://IPアドレス:ポート番号/calc/add」へのリクエストがAddクラスで処理されるようになる
- @GET: このメソッドにHTTP GETメソッドでアクセスするための指定
- @Produces: メソッドが返す値のメディアタイプの指定。ここではプレーンテキスト(MediaType.TEXT_PLAIN)を出力するようにしている
- @QueryParam: クエリーストリングとメソッドの引数とを関連付ける。ここではクエリーストリング「x」とaddメソッドの「ax」引数、クエリーストリング「y」と「ay」引数を関連付けている
ここまで入力できたら、javacコマンドを利用してコンパイルする。
ただし、アノテーションの付加に利用したクラスが含まれるjarファイルをjavacコマンドの「-cp」オプションで指定する必要がある。
そのため、コマンドラインは以下となる。
> javac -cp %CATALINA_HOME%\webapps\calc\WEB-INF\lib\javax.ws.rs-api-2.0.1.jar Add.java
クラスが出力されたら、今度はTomcatのインストールディレクトリの下にあるwebappsディレクトリの下(「webapps\calc\WEB-INF\classes\com\example」ディレクトリ)にコピーしよう。
> mkdir %CATALINA_HOME%\webapps\calc\WEB-INF\classes\com
> mkdir %CATALINA_HOME%\webapps\calc\WEB-INF\classes\com\example
> copy *.class %CATALINA_HOME%\webapps\calc\WEB-INF\classes\com\example
なお、アノテーション付きでコンパイルしたクラスを「com\example」ディレクトリへコピーすると以前と同様に実行できることも確認しておこう。
> copy *.class com\example
Add.class
com\example\Add.class を上書きしますか? (Yes/No/All): all ← 上書き確認が表示されるのでallと入力する
1 個のファイルをコピーしました。
> java com.example.Add 100000000 80000000000 ← JAX-RSのアノテーションはjavaコマンドでの実行時には無視されるため、javax.ws.rs-api-2.0.1jarファイルを指定する必要はない
80100000000 ← 100000000に80000000000を足した結果が表示される
これがJAX-RSの一番重要な特徴だということはいくら強調してもし過ぎることがない。
Webサービスとして実行可能にコンパイルしたクラスであるにもかかわらず、javaコマンドで特別なjarファイルを必要とせずに実行できるということは、Webの環境とは独立して開発、テストを回すこともできれば、実装する機能によっては独立したユーティリティクラスとして他の用途にも使い回せるということだ。
Webサービスの実行
ここまでで、以下の環境が用意できている。
- Tomcatが呼び出すWebアプリケーションの既定ディレクトリ(%CATALINA_HOME%\webapps)に「calc」というWebアプリケーション用ディレクトリ*7を作成した
- calcコンテクストが利用するライブラリディレクトリ(%CATALINA_HOME%\webapps\calc\WEB-INF\lib)へJerseyをインストールしてJAX-RSを実行できるようにした
- web.xmlファイルで、calcディレクトリに続くディレクトリ名をJAX-RSのパスとして処理できるようにした
- Addクラスに「add」というパス名をアノテーションで組み込んだ
- AddクラスのaddメソッドをHTTPのGETメソッドで呼び出すようにアノテーションで指定した
- addメソッドの2つの引数をクエリーストリングの「x」と「y」の2つの変数で置き換えるようにアノテーションで指定した
- Addクラスをcalcコンテクストへコピーした
*7 ディレクトリで分割されたWebアプリケーションの個々の単位を「コンテクスト」と呼ぶ。
Tomcatを実行するには、Tomcatをインストールしたディレクトリ下のbinディレクトリのstartup.batファイルを実行する。
このとき、CATALINA_HOMEとJAVA_HOMEの2つの環境変数が設定されている必要がある。これらの環境変数はこれまで利用してきたコマンドプロンプトで設定済みなので、以下ではそのまま実行できる。
> %CATALINA_HOME%\bin\startup.bat
Using CATALINA_BASE: "C:\Users\user\apache-tomcat-8.0.14"
Using CATALINA_HOME: "C:\Users\user\apache-tomcat-8.0.14"
Using CATALINA_TMPDIR: "C:\Users\user\apache-tomcat-8.0.14\temp"
Using JRE_HOME: "C:\progra~1\java\jdk1.8.0_25"
Using CLASSPATH: "C:\Users\user\apache-tomcat-8.0.14\bin\bootstrap.jar;C:\Users\user\apache-tomcat-8.0.14\bin\tomcat-juli.jar"
startup.batファイルを実行するとコマンドプロンプトにTomcatが利用する環境変数が表示され、別のコマンドプロンプトでTomcatが実行される。TomcatのコマンドプロンプトはアイコンがJavaのアイコン(コーヒーカップ)となる。
なお、Tomcatが既定で利用するポートはTCP/8080だ。Windowsでの初回実行時には、ファイアウォールによってアクセスの可否が問い合わせられる。動作を確認するには[アクセスを許可する]ボタンをクリックして許可する必要がある。
Tomcatの起動が完了すると、Tomcatのコマンドプロンプトの最後に、以下のような表示が出力される。
Server startup in 8678 ms
上の例で「8678」の部分は開始までにかかった時間(ミリ秒)なので実行環境(端的にはコンピューターの速度)によって変化する。
起動が完了したら、Webブラウザーを開いてアドレスバーに「http://127.0.0.1:8080/calc/add?x=100000000&y=80000000000」と打ち込んでみよう。Webブラウザーに「80100000000」と表示されることが確認できる。「x」や「y」の値をいろいろ変えて呼び出してみよう。
最後にTomcatを終了するには、CATALINA_HOMEとJAVA_HOMEの2つの環境変数が設定されているコマンドプロンプト(Tomcatのコマンドプロンプトではない点に注意)から、%CATALINA_HOME%\bin\shutdown.batファイルを実行する。
これまで利用してきたコマンドプロンプトで以下を打ち込んでTomcatを終了させよう。
> %CATALINA_HOME%\bin\shutdown.bat
Using CATALINA_BASE: "C:\Users\user\apache-tomcat-8.0.14"
Using CATALINA_HOME: "C:\Users\user\apache-tomcat-8.0.14"
Using CATALINA_TMPDIR: "C:\Users\user\apache-tomcat-8.0.14\temp"
Using JRE_HOME: "C:\progra~1\java\jdk1.8.0_25"
Using CLASSPATH: "C:\Users\user\apache-tomcat-8.0.14\bin\bootstrap.jar;C:\Users\user\apache-tomcat-8.0.14\bin\tomcat-juli.jar"
startup.batファイルを実行したときと同様にTomcatが利用する環境変数を表示してshutdown.batファイルはすぐに終了し、しばらくするとTomcatのコマンドプロンプトがクローズされる。
最後に、JAX-RSの動作について、簡単に解説をしておこう。
Copyright© Digital Advantage Corp. All Rights Reserved.