JerseyでRESTアプリケーションを作る
  Web, Java, プログラミング

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.0jaxrs-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.jarjaxrs-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.javaMyResource.javaの2つのファイルでプログラム作成は完了です。

WARファイルをビルドする

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

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

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

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

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

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