[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] 文字列の分割(split)

こんにちは。 今回は、文字列の分割について解説します。 昔はStringTokenize

記事を読む

no image

[Java] Apache POIでExcel操作!

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

記事を読む

no image

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

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

記事を読む

no image

[java] 文字列の一部を切り取る方法(substring)

こんにちは。 今回は文字列の一部を切り取る方法について解説します。 具体的には、String

記事を読む

no image

[Java] StringBuilderの使い方(Stringを連結するクラス)

今回は、可変長文字列クラスのStringBuilderを紹介します。 固定長文字列クラスのSt

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

[Java] CSVファイルの読み込み方法

こんにちは、kei0310です。 CSVファイルをJavaに取り込む方法を解説します。

記事を読む

スポンサードリンク

Message

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

スポンサードリンク

no image
CentOSにdockerをインストールしてみた

前置き dockerをcentos7にインストールしてみました

no image
awkでのgsubを使った文字列置換(正規表現)

まえおき bashなどのシェルスクリプトで、lsした結果とかを

no image
bashで並列処理する方法(xargs)

並列処理とは 通常、意識せずにプログラムを書くと、大体の場合は

no image
AWS Redshiftの使用ストレージ容量をクエリで調べる方法

用途 AWS Redshfitのコンソールを見れば、使用中のス

no image
pythonでstorage transfer serviceを使ってみた。

準備 pythonのインストールとかする。 このあたり。

→もっと見る

  • 2022年8月
    1234567
    891011121314
    15161718192021
    22232425262728
    293031  
  • 2022年8月
    1234567
    891011121314
    15161718192021
    22232425262728
    293031  
PAGE TOP ↑