[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] StringBuilderの使い方(Stringを連結するクラス)

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

記事を読む

no image

[Java] 文字列の分割(split)

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

[Java] Apache POIでExcel操作!

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

[Java][Servlet] EclipseでのJavaServlet作成

こんにちは、今回はEclipseを使用してJavaServletを作成します。 Eclipse

記事を読む

スポンサードリンク

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年11月
     123456
    78910111213
    14151617181920
    21222324252627
    282930  
  • 2022年11月
     123456
    78910111213
    14151617181920
    21222324252627
    282930  
PAGE TOP ↑