[Java][Jersey] JerseyでRESTfulなJAX-RS Webサービス作成

公開日: : Java , , , ,

こんにちは、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ファイルをダウンロードします。
jersey01

●JSONICのダウンロード

以下ページから、JSONICの最新版をダウンロードします(本記事執筆時点では1.3.0)
http://jsonic.sourceforge.jp/

●Jersey、JSONICの配置

ダウンロードしたファイルを解凍し、中のすべてのjarファイル(直下、api, ext, libフォルダに入っているjar全て)を
「/WebContent/WEB-INF/lib/」の中にコピーします。20個超あるとおもいます。
jersey02

●Javaの作成

以下の位置に二つクラスを作成します。

・test.jersey.resources.TestJerseyResource.java
・test.jersey.response.TestResponse.java
jersey03

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も変わります。

スポンサードリンク

関連記事

no image

[Java] Javaのインストール(プログラム開発・入門用)

Javaのコードを書きたい!! という目的のためのJavaのインストール方法と、コマンドラインでの

記事を読む

no image

[Java] 日付の計算方法(DateFormat、Date、Calendar)

こんにちは、kei0310です。 Javaで日付を計算する方法について解説します。 まず

記事を読む

no image

[Java][Spring] Spring3でDIしてみる!(アノテーション使用)

Spring3を使って、一番基本的な形のプログラムを作成してみます。 今回は、アノテーションを

記事を読む

no image

[Java][Servlet][JSP] ServletからJSPへの転送

こんにちは。 今回は、「Servletでリクエストを受けて、JSPで表示する。」方法を解説しま

記事を読む

no image

[Java] Apache POIでExcel操作!

Apache POIをまずは使ってみようという方(自分も含め)のメモ 導入 Maven htt

記事を読む

no image

[Java][Eclipse] Mavenが利用可能な動的Webプロジェクトの作成

こんにちは、keiです。 今回は、Mavenが利用可能な動的Webプロジェクトの作成について解

記事を読む

no image

[Java][MySQL] JavaからMySQLを使う方法

MySQLは、フリーでありながら商用としても使用できるパワーを持つデータベース(RDB)です。

記事を読む

no image

[Java][基本] ループ処理(for文)

Javaのループ処理の基本である、for文を解説します。 ●文法 for( [①初期化];

記事を読む

no image

[Java][Framework] Spring BootのJPAでDB接続した際のEntityキャッシュのクリア方法

Spring BootのJPAでDBアクセスした際に、処理を一定量こなすと、Heapが足りなくな

記事を読む

no image

[Java] テキストファイルの読み込み方法

こんにちは、今回はテキストファイルをJavaで読む方法を紹介します。 標準で提供されているクラ

記事を読む

スポンサードリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

スポンサードリンク

no image
[Re:dash] BigQuery接続で日本語タイトルを出す(v2.0.0)

BigQueryは現在マルチバイトを含むSQLを発行することができない

no image
[Python] Nullの判定方法(None)

Nullの判定方法(None) 表記方法 Pythonでは、Nul

no image
[Python] 型の検査・判定

Pythonでの型の検査・判定方法 isinstance サン

no image
[python] 日付の取り扱い(datetime) 現在日付、計算、文字列変換(format)

現在日付 日付の計算 [crayon-5a5da595bd9d

no image
[python] 文字列結合

pythonでの文字列結合 サンプル

→もっと見る

  • 2018年1月
    « 10月    
    1234567
    891011121314
    15161718192021
    22232425262728
    293031  
  • 2018年1月
    « 10月    
    1234567
    891011121314
    15161718192021
    22232425262728
    293031  
PAGE TOP ↑