JerseyでRESTアプリケーションを作る

Web API といえば以前は SOAP でしたが HTML5/JavaScript による SPA Single Page Application が台頭するにつれ JavaScript で扱い易い REST に注目が集まっています。

Jersey Java REST アプリケーションを開発するための JAX-RS Java API for RESTful Web Services リファレンス実装です。

今回は Jersey を使って REST アプリケーションを開発する手順を解説していきます。

Eclipse

今回は 開発に Eclipse を使用します。以下のサイトから Eclipse IDE for Java EE Developers をダウンロードします。

Eclipse をダウンロードしたら早速起動しましょう。

しばらく待つとウェルカム ページが表示されます。右上の Workbench をクリックするとワークベンチに移動します。

ワークベンチが表示されたら右上のコーヒー豆のアイコンが選択状態の水色になっていることを確認します。

このコーヒー豆のアイコンは Java EE パースペクティブを表しています。Eclipse Java アプリケーション開発だけでなく様々な用途を持つ統合開発環境です。Java Web アプリケーションを開発するときは Java EE パースペクティブを選択するということを覚えておいてください。

Eclipse の既定の文字コードを UTF-8 に変更する

Windows 版の Eclipse は文字コードが Shift_JIS(MS932) に設定されているので 既定の文字コードを UTF-8 に変更しておきます。

メニューバーから WindowPreferences を選択します。

設定ウィンドウが表示されるので 左側のツリーから General → Workspace を展開します。右側の一番下に Text file encoding という設定があります。Other に切り替えて コンボボックスから UTF-8 を選択します。

最後に Apply and Close をクリックして変更を適用します。

Gradle プロジェクト

2015 年の Eclipse Mars 4.5 以降 Buildship というプラグインがデフォルトで含まれており Eclipse Gradle プロジェクトを扱えるようになっています。

Gradle は依存関係を自動的に解決して必要なライブラリを取得してくれるので JAX-RS のように依存ライブラリの多いアプリケーションを開発するのに役立ちます。今回は Gradle プロジェクトで REST アプリケーションを作成していきます。

メニューバーから FileNewProject... を選択します。

新規プロジェクトを作成するウィザードが表示されます。Gradle フォルダーを展開 Gradle Project を選択して Next をクリックします。

Gradle プロジェクト作成ウィザードのウェルカム ページが表示されます。適当に読み飛ばして Next をクリックします。

プロジェクト名を入力して Next をクリックします。今回はプロジェクト名を myapp としました。

オプションを選択する画面が表示されますが そのまま Next をクリックします。

確認画面が表示されます。Finish をクリックします。

Gralde プロジェクトの作成には少し時間がかかります。右下の進捗率を眺めながらゆっくりと待ちましょう。

 

Gralde プロジェクトの作成が完了すると Project Explorer myapp プロジェクトが表示されます。myapp プロジェクトを展開して build.gradle をダブルクリックします。

この build.gradle の中身を以下の内容で置き換えます 以下の内容をクリップボードにコピーしてまるごとペーストします

build.gradle
apply plugin: 'eclipse' apply plugin: 'java' apply plugin: 'war' def defaultEncoding = 'UTF-8' tasks.withType(AbstractCompile).each { it.options.encoding = defaultEncoding } tasks.withType(GroovyCompile).each { it.groovyOptions.encoding = defaultEncoding } javadoc { options.charSet = defaultEncoding options.encoding = defaultEncoding options.memberLevel = JavadocMemberLevel.PUBLIC } tasks.withType(JavaCompile) { options.compilerArgs << "-parameters" } repositories { mavenCentral() jcenter() } dependencies { compile fileTree(dir: 'lib', includes: ['**/*.jar'], excludes: ['**/*-sources.jar', '**/*-javadoc.jar']) providedCompile 'javax.servlet:javax.servlet-api:3.1.0' providedCompile 'org.glassfish.jersey.bundles:jaxrs-ri:2.0.1' } defaultTasks 'clean', 'build', 'war' war { archiveName = "${archivesBaseName}.war" } task initializeProjectFiles { doLast { if(file('src/main/java/Library.java').exists()) { file('src/main/resources').mkdirs() file('src/main/webapp/WEB-INF').mkdirs() file('lib').mkdir() delete "src/test" delete "src/main/java/Library.java" } } } tasks.eclipseClasspath.dependsOn(cleanEclipseClasspath) tasks.eclipseClasspath.dependsOn(initializeProjectFiles) tasks.cleanEclipseClasspath.mustRunAfter(initializeProjectFiles)

置き換えた build.gradle は以下のようになります。Ctrl + S を押して上書き保存してください。

1 行目で eclipse プラグインを追加しています。これにより必要な依存ライブラリを含む Eclipse プロジェクトファイルが自動的に作成されます。Eclipse プロジェクトに手作業で依存ライブラリを 1 つずつ追加していく手間がかかりません。

3 行目で war プラグインを追加しています。これは Gradle プロジェクトをビルドしたときに Web アプリケーション(WAR ファイル)を作成するための設定です。

28~29 行目で依存ライブラリとして servlet-api 3.1.0 jaxrs-ri 2.0.1 を指定しています。この指定により必要なライブラリがすべて自動的にダウンロードされて Eclipse プロジェクトに追加されます。

build.gradle への変更を反映するために Gradle Tasks ビューのリフレッシュ アイコンをクリックします。

Gradle Tasks ビューが見つからないときは?
メニューバーから WindowShow ViewOther... を選択して Gradle フォルダー内の Gradle Tasks を選び Open をクリックすると Gradle Tasks ビューが表示されます。

Gradle Tasks のリフレッシュには少し時間がかかります。ゆっくりと待ちましょう。

Gradle Tasks のリフレッシュが完了してから もう一度 Gradle Tasks ビューに表示されている myapp プロジェクトを展開すると先程までは表示されていなかった ide というフォルダーが追加されています。これが build.gradle Eclipse プラグインを追加した効果です。

ide フォルダーを展開 eclipse を右クリックして Run Gradle Tasks をクリックします。

Gradle タスクを実行すると 自動的に Gradle Executions ビューに切り替わって進行状況が表示されます。タスクが成功すると緑色のアイコンが表示されます。

Gradle タスクの実行によって Eclipse プロジェクトの構成が変化しました。Project Explorer から myapp プロジェクトを選択して右クリックして Refresh をクリックするとプロジェクトの構成変化が反映されます。

プロジェクトの構成が以下のように変わりました。

Java Resources のアイコンに地球のマークが表示されているのは このプロジェクトが Web アプリケーション用のプロジェクトであることを表しています。build.gradle WAR プラグインを追加していたので自動的にプロジェクトが Web アプリケーション用に構成されました。

Referenced Libraries を展開してみると javax.servlet-api-3.1.0.jar jaxrs-ri-2.0.1.jar をはじめとして多くの JAR ライブラリが表示されています。

これが build.gradle でライブラリを指定した効果です。指定したライブラリだけでなく さらに それが依存しているライブラリまで自動的に取得してくれます。自分で 1 つずつ GUI 操作で JAR ファイルを追加していく手間が掛かりません。

さらに驚くべきことに これらの JAR ファイルにはソースコードと Javadoc がアタッチされた状態になっており 開発時に Javadoc が表示されたり デバッグ実行でソースコードまでステップインしていくことができます。

Eclipse Buildship による Gradle プロジェクト開発すばらしいですね。

ソースコードを書こう

Gradle プロジェクトの準備が整ったので 早速 ソースコードを書いていきましょう。サーブレット 3.0 以降 ソースコード内にアノテーションを記述することで web.xml を省略できるようになりました。今回は web.xml を書かずに Web アプリケーションを作成していきます。

はじめての REST アプリケーションなので まずは Hello, World を表示するだけの簡単なプログラムにしましょう。

Project Explorer myapp プロジェクトの Java Resources を展開して src/main/java から NewClass をクリックします。

クラス作成ウィザードが表示されるので パッケージ名とクラス名を入力して Finish をクリックします。今回は下記の構成としました。

  • パッケージ名 com.example.myapp
  • クラス名   MyApplication

MyApplication.java を以下の内容に変更します。

MyApplication.java
package com.example.myapp; import javax.ws.rs.ApplicationPath; import org.glassfish.jersey.server.ResourceConfig; @ApplicationPath("/api") public class MyApplication extends ResourceConfig { public MyApplication() { packages("com.example.myapp"); } }

以下の 3 点に注目してください。

  • Jersey ResourceConfig クラスを継承しています。これで packages メソッドが使えるようになっています。
  • @ApplicationPath アノテーションを付与しています。これで /api にこのアプリケーションがマッピングされます。
  • コンストラクタで com.example.myapp パッケージを読み込むように指定しています。これで次に作成するリソースクラスが自動的に読み込まれるようになります。

次に MyApplication.java と同様の手順で MyResource.java を作成して以下の内容に変更してください。

MyResource.java
package com.example.myapp; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/") public class MyResource { @Path("/hello") @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "Hello, World!!"; } }

MyResource.java は以下の点に注目してください。

  • @Path アノテーションが付与されています。これで /hello にこのメソッドがマッピングされます。
  • @GET アノテーションが付与されています。これで HTTP リクエストの GET メソッドを使ったときに このメソッドが呼ばれるようになります。POST メソッドなど他の方法でアクセスした場合はこのメソッドは呼び出されません
  • @Produces でレスポンス形式を指定しています。今回は Content-Type: plain/text になるようにしています。

以上 MyApplication.java MyResource.java 2 つのファイルでプログラム作成は完了です。

WAR ファイルをビルドする

最後に myapp プロジェクトをビルドして Web アプリケーション WAR ファイル を作成します。

Gradle Tasks ビューに表示されている myapp を右クリックして Run Default Gradle Tasks をクリックします。build.gradle の中でデフォルト タスクとして clean build war を指定してあるので この 1 つの操作だけでビルドと WAR ファイルの作成が完了します。

Gradle タスクの進行状況は Gradle Executions に表示されます。すべてに緑色のアイコンが表示されれば完了です。

Gradle タスクが完了後 myapp プロジェクト内の build¥libs myapp.war が作成されています。

以上で Eclipse + Gradle を使った簡単な Jersey REST アプリケーションの開発手順となります。

次の記事 myapp.war Jetty アプリケーション サーバーにデプロイ 配備 して動かす手順を説明していきます。

この記事を共有しませんか?