はじめに
最近jersey使うようになって、結構便利なので始め方をメモします。
手順
環境の準備
必要なものをインストールします(括弧内は今回使ったもの)
- Java (jdk8)
- tomcat (Tomcat7.0.54)
- Eclipse (Luna Java EE)
Eclipse起動、設定
Eclipseを起動
archetypeの登録
- 設定(Preference)からMaven->Archtypesを開く
- Add Remote Catalog(日本語名は未確認)ボタンをクリックし、Catalog Fileに"http://repo1.maven.org/maven2/archetype-catalog.xml" を設定
サーバーにTomcatを追加
- 設定(Preference)からServer->Runtime Environmentsを開く
- 追加でインストールしたTomcatを選択、保存
- サーバービューを開く
- ビュー内右クリック->サーバー追加から追加する
プロジェクト作成
- メニューから新規プロジェクト->Maven Projectを選択
- workspaceは任意(デフォルトでOK)に設定してOK
- Archetype選択画面でgroupId=org.glassfish.jersey.archetypes、ArtifactId=jersey-quickstart-webappを選択(間違ってgroupId=com.sun.jersey.archetypesの方を選ばないように)
- Maven ProjectのGroupId, ArtifactId, Version, Packageを設定(任意)してFinish
今回は次のように設定しました
- GroupId=com.github.kamegu (公開する可能性があるなら他の人と重複しないように)
- ArtifactId=jersey-eclipse (プロジェクト名となります)
- Version=0.0.1-SNAPSHOT (デフォルトのまま)
- package=com.github.kamegu.first
Eclipseのプロジェクトが出来てると思います。
プロジェクト上でエラーとなっているかも知れませんが「javax.servlet.http.HttpServletが見つからない」というエラーなら問題ありません。
サーバービューからサーバーを起動して下記URLを開く
http://localhost:8080/jersey-eclipse/
"jersey-eclipse"はプロジェクト名に置き換えてください
ページが表示され"Jersey resource"というリンクがあるはずですのでこれをクリックします。
"Got it!"と表示されていればOKです。
動作の説明
JAX-RS2.0ではリソースを提供するために主にアプリケーションクラスとリソースクラスが必要です。
アプリケーションクラスはjavax.ws.rs.core.Applicationインターフェースを実装するクラスで主に設定を司る。リソースクラスはリソースに対応するメソッドを持つ。
アプリケーションクラス
上で作成されたプロジェクトではアプリケーションクラスは作られていない。アプリケーションクラスがあれば、自動的にそれが読み込まれるが、ないばあいはweb.xmlに登録する必要がある。実際にweb.xmlに次のように登録されている。
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.github.kamegu.first</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
リソースクラス
リソースクラスは一つだけ上のpackageで指定したパッケージに作られている。
@Path("myresource")
public class MyResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return "Got it!";
}
}
web.xmlで指定されている/webapp/とMyResourceの@Pathアノテーションで指定されている"myresource"をコンテキストパスである"jersey-eclipse"に連結した/jersey-eclipse/webapp/myresourceがgetItメソッドに対応するURLとなる。
先ほどの"Jersey resource"のリンクURLと一致しているはず。
メソッドにも@Pathアノテーションを付けられる。たとえば@Path("aa/bb")とするとURLは"〜〜myresource/aa/bb"となる
@GETアノテーションがついているので、GETリクエストに対応する。
ここまでをGitHubに挙げてます
https://github.com/kamegu/jersey-eclipse-test/tree/0.0.1-create-project
ちょっと修正
今のままだと今後の拡張性が乏しいので修正する。
依存ライブラリ変更
まず、tomcat7なのでservlet3に対応するように
jersey-container-servlet-core -> jersey-container-servlet に変更
jspファイルの「javax.servlet.http.HttpServletが見つからない」エラーを解消するためにservlet-apiを追加
アプリケーションクラスを作成
Applicationインターフェースを直接実装してもいいが、jerseyにはResourceConfigという便利なクラスがあるので、それを継承して作る。
package com.github.kamegu.first;
import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;
@ApplicationPath("webapi")
public class WebapiConfig extends ResourceConfig {
public WebapiConfig() {
packages(this.getClass().getPackage().getName());
// packages("com.github.kamegu.first");
}
}
これがweb.xmlにあるservlet設定と同等の意味を持つ。
なので、web.xmlの設定は削除する。
ここまでをGitHubに挙げてます。
https://github.com/kamegu/jersey-eclipse-test/tree/0.0.1-change-config