[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][Framework] Spring Bootを使って、Spring MVC速攻開発してみる!(DB接続あり)

STSインストール STSは、EclipseにSpring関連のいろいろな機能を詰め込んだオールイ

記事を読む

no image

[Java][Spring] DIする方式を細かく見てみる① @ScopeでのSingletonとPrototypeの指定

今回は@Scopeアノテーションを用いて、オブジェクトをDIする方式を選択してみます。 ●解説

記事を読む

no image

[Java][JSP] EclipseでのJSP作成

今回は、Eclipseを用いてJSPを作成してみます。 まず、Eclipseを起動します。

記事を読む

no image

[Java] Apache POIでExcel操作!

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

[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のインストールとかする。 このあたり。

→もっと見る

  • 2024年4月
    1234567
    891011121314
    15161718192021
    22232425262728
    2930  
  • 2024年4月
    1234567
    891011121314
    15161718192021
    22232425262728
    2930  
PAGE TOP ↑