特集
» 2014年11月10日 15時07分 公開

JAX-RSを活用して、JavaクラスをWebサービス化しよう特集:JAX-RS入門(3/4 ページ)

[arton,著]

アノテーションの組み込み

 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]));
  }
}


アノテーションを付加し、Webサービス化したAddクラス

 ここで使っているアノテーションについてざっくりと説明をすると次のようになる。

  • @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


アノテーションを付加したAddクラスをコンパイルするためのコマンドライン

 クラスが出力されたら、今度は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


Add.classファイルをWebアプリの「classes」ディレクトリにコピー

 なお、アノテーション付きでコンパイルしたクラスを「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を足した結果が表示される


Webサービス化したAddクラスは、以前と同様にコマンドラインから実行可能

 これが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"


Tomcatを実行

 startup.batファイルを実行するとコマンドプロンプトにTomcatが利用する環境変数が表示され、別のコマンドプロンプトでTomcatが実行される。TomcatのコマンドプロンプトはアイコンがJavaのアイコン(コーヒーカップ)となる。

 なお、Tomcatが既定で利用するポートはTCP/8080だ。Windowsでの初回実行時には、ファイアウォールによってアクセスの可否が問い合わせられる。動作を確認するには[アクセスを許可する]ボタンをクリックして許可する必要がある。

Tomcatへのアクセスを許可する Tomcatへのアクセスを許可する

 Tomcatの起動が完了すると、Tomcatのコマンドプロンプトの最後に、以下のような表示が出力される。

Server startup in 8678 ms


Tomcatの実行開始時には、それまでにかかった時間が表示される

 上の例で「8678」の部分は開始までにかかった時間(ミリ秒)なので実行環境(端的にはコンピューターの速度)によって変化する。

 起動が完了したら、Webブラウザーを開いてアドレスバーに「http://127.0.0.1:8080/calc/add?x=100000000&y=80000000000」と打ち込んでみよう。Webブラウザーに「80100000000」と表示されることが確認できる。「x」や「y」の値をいろいろ変えて呼び出してみよう。

Webサービス化したAddクラスの実行画面 Webサービス化したAddクラスの実行画面

 最後に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"


Tomcatの実行終了

 startup.batファイルを実行したときと同様にTomcatが利用する環境変数を表示してshutdown.batファイルはすぐに終了し、しばらくするとTomcatのコマンドプロンプトがクローズされる。

 最後に、JAX-RSの動作について、簡単に解説をしておこう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。