[Java][Jersey] JerseyでRESTfulなJAX-RS Webサービス作成
こんにちは、keiです。
今回はRESTfulなWeb Serviceの作成を行っていきます。
世の中では、Webを通して、アプリケーションインターフェースを提供するという意味で、WebAPIと良く呼ばれるものです。
また、正式にはJSX-RSとして定義されています。
Web Serviceには、呼ぶ側(Client)、呼ばれる側(Server)があります。
今回は呼ばれる側(Server)の作成を行います。
使用するミドルウェアは、JAX-RSのリファレンス実装であるJerseyを使用します。
もはや商用以外では、デファクトスタンダードと言っても過言ではないものです。
URLでアクセスして、JSONでレスポンスを返す一般的なRESTサービスを作成します。
JSONエンコードには、和製のJSONICを使います。
他にもJackson、Gson等ありますが、簡単で高速なのがJSONICのウリです。
●プロジェクトの作成
今回の記事で使用するプロジェクトは、[Java][JSP] EclipseでのJSP作成で
使用したものをそのまま使います。
●Jerseyのダウンロード
Mavenでも出来ますが、私は「出来ればMavenを使いたくない派」なので、
普通にやります。
以下ページにアクセスします。
https://jersey.java.net/download.html
下図のリンクをクリックしてzipファイルをダウンロードします。
●JSONICのダウンロード
以下ページから、JSONICの最新版をダウンロードします(本記事執筆時点では1.3.0)
http://jsonic.sourceforge.jp/
●Jersey、JSONICの配置
ダウンロードしたファイルを解凍し、中のすべてのjarファイル(直下、api, ext, libフォルダに入っているjar全て)を
「/WebContent/WEB-INF/lib/」の中にコピーします。20個超あるとおもいます。
●Javaの作成
以下の位置に二つクラスを作成します。
・test.jersey.resources.TestJerseyResource.java
・test.jersey.response.TestResponse.java
Javaコードは以下のとおり。
・test.jersey.resources.TestJerseyResource.java
package test.jersey.resources;
import java.util.HashSet;
import java.util.Set;
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.Response;
import net.arnx.jsonic.JSON;
import test.jersey.response.TestResponse;
@Path("/api")
public class TestJerseryResource {
// テストデータ
private static Set<TestResponse> set;
static{
// とりあえずテストデータ(ほんとはこんなことやってはダメ)
set = new HashSet<TestResponse>();
set.add(new TestResponse(1, "一郎"));
set.add(new TestResponse(2, "次郎"));
set.add(new TestResponse(3, "三郎"));
set.add(new TestResponse(4, "四郎"));
}
@GET
@Path("/method")
@Produces({"application/json"})
public Response TestResource(@QueryParam("id") int id){
TestResponse res = null;
// idが一致するデータを返す
for( TestResponse tmp : set ){
if(id == tmp.getId()){
res = tmp;
}
}
// 一致無しの場合は空データを返す
if( res == null ){
res = new TestResponse(0, "");
}
// JSONICでJSON文字列にエンコードする。
String json = JSON.encode(res);
return Response.ok()
.entity(json)
.build();
}
}
クラス(Resource)を/apiにマッピングし、エンドポイント(メソッド)を/methodにマッピングしています。
「@GET」は見ての通りGETメソッドでのみ呼ばれることを示します。
「@QueryParam("id") int id」は、クエリパラメータのid属性を引数idに入力することを示します。
「Produces({MediaType.APPLICATION_JSON})」は、「JSONでレスポンスを返すよ」ということを示します。
あとは、BeanをJSONにしてreturnすればOKです。
・test.jersey.response.TestResponse.java
package test.jersey.response;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class TestResponse {
private int id;
private String name;
/**
* デフォルトコンストラクタ(JSONエンコードに必須)
*/
public TestResponse(){
}
/**
* データ初期化用コンストラクタ
* @param id
* @param name
*/
public TestResponse(int id, String name){
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
このクラスはただのBeanですが、XmlRootElementアノテーションを指定しています。
これは、JAXBの仕様によるもので、JSONにエンコードする際に必要なものです。
そのほかにも、「デフォルトコンストラクタがあること」「setter、getterがある。またはpublicフィールドであること」という決め事があります。
・web.xml
「/WebContent/WEB-INF/web.xml」を作成します。(既にあればそれを使います)
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<servlet>
<servlet-name>Jersey Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>test.jersey.resources</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
ここまで出来たら、サーバを起動して以下のURLにアクセスします。
「http://localhost:8080/TestJavaServlet/rest/api/method?id=1」
以下のJSONが返却されれば成功です。
{"id":1,"name":"一郎"}
URL中のidの数値を変更すると、返されるJSONも変わります。
スポンサードリンク
関連記事
-
-
[Java] Apache POIでExcel操作!
Apache POIをまずは使ってみようという方(自分も含め)のメモ 導入 Maven htt
-
-
[Java][Servlet][JSP] ServletからJSPへの転送
こんにちは。 今回は、「Servletでリクエストを受けて、JSPで表示する。」方法を解説しま
-
-
[Java][Spring] DIする方式を細かく見てみる① @ScopeでのSingletonとPrototypeの指定
今回は@Scopeアノテーションを用いて、オブジェクトをDIする方式を選択してみます。 ●解説
-
-
[Java] クラスとインスタンス
こんにちは。 クラスとインスタンスについて解説します。 インスタンスは「オブジェクト」とも言
-
-
[Java][基本] mainメソッドの書き方
こんにちはkeiです。 Javaの基本として、意外と知らないmain関数について解説します。
-
-
[Java][基本] ループ処理(for文)
Javaのループ処理の基本である、for文を解説します。 ●文法 for( [①初期化];
-
-
[Java] 日付の計算方法(DateFormat、Date、Calendar)
こんにちは、kei0310です。 Javaで日付を計算する方法について解説します。 まず
-
-
[Java] CSVファイルの読み込み方法
こんにちは、kei0310です。 CSVファイルをJavaに取り込む方法を解説します。
-
-
[Java] 文字列の分割(split)
こんにちは。 今回は、文字列の分割について解説します。 昔はStringTokenize
-
-
[Java][Eclipse] Mavenが利用可能な動的Webプロジェクトの作成
こんにちは、keiです。 今回は、Mavenが利用可能な動的Webプロジェクトの作成について解