JAX-RSを活用して、JavaクラスをWebサービス化しよう:特集:JAX-RS入門(1/4 ページ)
JAX-RSを使用すると、通常のJavaクラスをいとも簡単にWebサービス化できる。本稿では、ごく簡単なJavaプログラムを例に、その方法とJAX-RSの動作について解説する。
powered by Insider.NET
この記事では、Javaの比較的新しい*1Webサービス用フレームワークJAX-RSを利用したJavaクラスのWebサービス化について解説する。
*1 仕様は2008年10月に確定された。
JAX-RSはもともとRESTアーキテクチャなWebアプリを作成するための仕様だが、これを利用すると、普通のJavaクラスにアノテーションを付けるだけでWebサービスとして公開できるようになる。この記事では単純なJavaクラスを作成し、それをJAX-RSを利用してWebサービスとして公開するまでを示す。
なお、JAX-RS自体はJava EEの仕様のため、Java SEで利用可能なフレームワークはサードパーティによって提供される。本記事ではjava.netで公開されているJerseyを利用する。インストール手順などは記事内で説明する。
JAX-RSを利用したWebサービスがどのように動作しているかは最後で解説するものとして、ここではJAX-RSを利用すると、普通のJavaクラスをWebサービス化するのがどれほど簡単かに注目いただきたい。
JAX-RSの意義
全てのソフトウェアをサービスとして実装することは現代のソフトウェア開発において極めて重要な意味を持つ*2。
*2 この件については、元アマゾンのSteve Yaggeがグーグルの同僚に対して書いた『Steve Yegge の Google とプラットフォームに関するぶっちゃけ話』(前編、中編、後編)が参考になる。
ソフトウェアのサービス化をひと言で説明すると、以下のようにまとめられる。
- ソフトウェアを分割することで、個々のソフトウェアの設計と実装をできるだけ単純な状態に保つ
- 相互にインターフェースを介して利用可能とすることで、個別に修正/更新できるようにする
- 位置の独立性を保つことでスケーラビリティを確保できるようにする
関連する用語として『マイクロサービス』*3がある。
JAX-RSは「Java+HTTP」(つまりWeb)で全てのソフトウェアをサービス化するのに必要十分な機能を提供するインフラだ。
その特徴はアノテーション*4を利用することで、特別なJavaのインターフェースへ依存させずにWebサービスを実装できることだ。本記事では実際に単純なコマンドライン用クラスをWebサービス化する。極めて単純なプログラムなのでWebサービスとしてはサンプル以上の意味はない。しかしJAX-RSのパワーを示すには十分なものと思う。
*3 マイクロサービスについては、クックパッドの高井さんのブログ記事「クックパッドとマイクロサービス」が参考になる。
*4 「アノテーション」とは日本語では「注釈」に相当する。「@」に続けてアノテーション用クラス名を記述すると、クラスファイル内にクラスやメソッドの付加情報(アノテーション)を埋め込むことができる。例えば、本稿では以下のようなアノテーションを使用している。「@GET」「@Produces(…)」「@QueryParam(…)」がアノテーションであり、その後に続くメソッドやパラメーターに付加情報を与えている。
@GET
@Produces(MediaType.TEXT_PLAIN)
public String add(@QueryParam("x") String ax, @QueryParam("y") String ay) {
…… 省略 ……
}
本記事用の準備
この記事では、依存関係を最小にし、JAX-RSで通常のJavaクラスをどのようにWebサービス化すればよいかにフォーカスするために、以下の3つのソフトウェアとコマンドプロンプトのみを利用する。また、各種操作については、Windowsを前提として説明する。
- Java SE JDK: Java開発キット
- Jersey: JAX-RSの実装の1つ
- Tomcat: Java Servletコンテナー(Javaアプリケーション用Webサーバー)の実装の1つ
ソースコードもごくシンプルなものとしてあるため、メモ帳で十分に編集可能である。
最初にJDKを用意する。JDKはJava SEのダウンロードページからダウンロードできる。該当ページにはいくつかのバージョンが用意されているが、通常は最初に掲載されているものをダウンロードすればよい。2014年10月現在は、Java SE 8u25が最新である。「JDK」の下にある[DOWNLOAD]ボタンをクリックすると、ページが遷移しライセンスへの同意を求められる。同意できるのであれば[Accept License Agreement]を選択してから、利用しているOSに適合するJava SE Development Kitをダウンロードし、インストールする。途中でJRE(Javaランタイム)のインストールの可否を聞かれるので同様にインストールする。
なおインストールしたディレクトリはコントロールパネルを利用して環境変数JAVA_HOMEに設定するとよい*5。Windowsであれば、「C:\Program Files\Java\jdk(バージョン)」ディレクトリが既定のインストール先となる(Java SE 8u25なら「C:\Program Files\Java\jdk1.8.0_25」となる)。ただし、「Program Files」ではなく「Progra~1」などの空白文字を含まないショートネームを使うことをお勧めする(後述の脚注*6を参照)。
*5 以降では便宜のためにコマンドプロンプトに対して設定する。
コマンドライン用クラス
最初に単純なクラスを作ってみよう。ここでは操作と結果が分かりやすいことから、2つの引数を受け取って加算する処理を行うAddクラスを作ることにする。
最初にコマンドプロンプトを開く。「C:\Users\ログインユーザー名」がカレントディレクトリとなるので、以降、このディレクトリの下に作業用のディレクトリを作成して、そこで作業を行う。なお、以下の例でコマンドプロンプトの出力例にはログインユーザー名として「user」という文字列を利用する。
最初にJAVA_HOME環境変数を設定し(Java SE JDKのインストール後に設定済みの場合は除く)、次にJDKのbinディレクトリをPATH環境変数に追加してJavaコンパイラーが動作できるようにする(以下では、プロンプトを「>」とする)。
> set JAVA_HOME=C:\Progra~1\Java\jdk1.8.0_25 ← *6
> set PATH=%JAVA_HOME%\bin;%PATH%
*6 「Progra~1」は「Program Files」ディレクトリのショートネーム。空白が入ったディレクトリを操作する場合は、ソフトウェアによっては異常な動作を引き起こすものがあるので、ショートネームを利用するとよい。なおショートネームはコマンドプロンプトのDirコマンドに「/x」オプションを指定すると確認できる。例えば、「dir /x c:\」とコマンドプロンプトで打ち込むと、「Program Files」ディレクトリのショートネームとして「PROGRA~1」が示されることが確認できる(大文字小文字は区別されない)。以下に例を示す。
> dir /x c:\
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は D875-3F7B です
c:\ のディレクトリ
2014/10/08 00:56 <DIR> Common7
2013/08/23 00:22 <DIR> PerfLogs
2014/10/31 01:50 <DIR> PROGRA~1 Program Files
2014/10/08 01:08 <DIR> PROGRA~2 Program Files (x86)
…… 省略 ……
ここでは「PROGRA~1」が「Program Files」ディレクトリの、「PROGRA~2」が「Program Files (x86)」ディレクトリのショートネームであることが確認できる。
次にワーク用のディレクトリ(ここでは「work」という名前を使っている)を作成し、そのディレクトリへ移動した後にメモ帳でソースファイルを作成する。
> mkdir work
> cd work
> notepad Add.java
メモ帳が「ファイルAdd.javaが見つかりません。新しく作成しますか?」とポップアップ表示するので、[はい]ボタンをクリックする。
次に以下のリストの内容を打ち込む。
package com.example;
import java.math.BigDecimal;
public class Add {
public static void main(String[] args) {
BigDecimal x = new BigDecimal(args[0]);
BigDecimal y = new BigDecimal(args[1]);
System.out.println(x.add(y).toString());
}
}
見ての通り、引数に受け取った2つの値をBigDecimal型の値として加算し、その結果をコンソールに出力しているだけだ。
ソースの内容は特に説明するまでもないだろうが、コマンドラインから2つの引数を受け取り、BigDecimal型の変数に変換し加算した結果を表示するプログラムである。
打ち込んだら、以下のようにコンパイルし、パッケージ名に合ったディレクトリ(この例では、パッケージ名が「com.example」なので、カレントディレクトリ以下の「com\example」ディレクトリになる)へクラスファイルをコピーし、プログラムを実行する。
> javac Add.java ← コンパイルエラーにならなければ特に表示は行われない
> mkdir com
> mkdir com\example
> copy *.class com\example
> java com.example.Add 100000000 80000000000
80100000000 ← 100000000に80000000000を足した結果が表示される
ここで作成したAddクラスを順にサービス化する。
Copyright© Digital Advantage Corp. All Rights Reserved.