* JAX-RSの環境構築 [#beb7a237]
#setlinebreak(on)
JAX-RSのリファレンス実装である jersey を利用してRESTfulなWebサービスを作成する手順を記載する。
#contents
--関連
---[[JAX-RSでの入力値の受取と返却]]
---[[JAX-RSによる簡単なWebサービス作成]]
** JAX-RSとは [#ebd02316]
#html(<div style="padding-left:20px;">)
JAX-RSはRESTfulなWebアプリケーションを作成するための仕様で、普通のJavaクラスにアノテーションを付けるだけでWebサービスとして公開できる。
#html(</div>)
** 環境構築(Gradle編) [#uf3b86c6]
#html(<div style="padding-left:20px;">)
jetty プラグインを利用する為、Tomcat 等のサーバのインストール等は不要。
*** 適当なフォルダを作成する [#t4644504]
#html(<div style="padding-left:20px;">)
#myterm(){{
mkdir mywebapp
}}
#html(</div>)
*** build.gradle の作成 [#a7f904cb]
#html(<div style="padding-left:20px;">)
作成したフォルダ配下に build.gradle を作成する。
#mycode(){{
apply plugin : 'java'
apply plugin : 'war'
apply plugin : 'jetty'
sourceCompatibility = 1.7
repositories {
mavenCentral()
}
jettyRun {
reload = "automatic"
scanIntervalSeconds = 1
}
dependencies {
providedCompile "javax.ws.rs:javax.ws.rs-api:2.0"
compile "org.glassfish.jersey.core:jersey-server:latest.release"
compile "org.glassfish.jersey.containers:jersey-container-servlet:latest.release"
compile "org.glassfish.jersey.media:jersey-media-json-jackson:latest.release"
}
}}
#html(</div>)
*** Gradle規約に合うようにフォルダ作成 [#hd0fc6a3]
#html(<div style="padding-left:20px;">)
以下の通り作成する
+ src
+ main
+ java
+ resources
+ webapp
+ WEB-INF
#html(</div>)
*** web.xml の作成 [#a04f373a]
#html(<div style="padding-left:20px;">)
WEB-INF 配下に web.xml を作成する。
#myhtmlcode(){{
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>MyWebService</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>example</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.scanning.recursive</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>10</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
</web-app>
}}
#html(</div>)
*** サービスの作成 [#uca18ee4]
#html(<div style="padding-left:20px;">)
src/main/java 配下に example フォルダを作成し、その配下に以下のクラスを作成する
#mycode(){{
package example;
import java.util.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Path("books")
public class BookResource {
/**
* 一覧取得<br />
* @return 結果(JSON文字列)
*/
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Map<String,Object>> list() {
// Mapを返却する例(自動でJSONに変換される)
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
for (int i = 0; i < 10; i++) {
Map<String,Object> rec = new HashMap<String,Object>();
rec.put("isbn" , "TEST" + i);
rec.put("title", "BOOK" + i);
rec.put("price", 1000 + i);
list.add(rec);
}
return list;
}
/**
* id指定検索
* @param id 対象データのid
* @return 結果(JSON文字列)
*/
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Map<String,Object> show(@PathParam("id") Integer id) {
Map<String,Object> rec = new HashMap<String,Object>();
rec.put("isbn" , "TEST1");
rec.put("title", "BOOK1");
rec.put("price", 1001);
return rec;
}
}
}}
#html(</div>)
*** サーバの起動 [#l43e6783]
#html(<div style="padding-left:20px;">)
最初に作成したフォルダ(mywebapp)に戻り、以下の通り jetty を起動する。
#myterm(){{
gradle jettyRun
}}
#html(</div>)
#html(</div>)
** 環境構築(eclipse + Tomcat) [#lb1b1d6b]
#html(<div style="padding-left:20px;">)
*** Java、Tomcat のインストール [#l03384cf]
#html(<div style="padding-left:20px;">)
※共に7以降をインストール
#html(</div>)
*** Webプロジェクトの作成 [#w5c7e3d1]
#html(<div style="padding-left:20px;">)
プロジェクト名、コンテキストルート とも "mywebapp" として作成
#html(</div>)
*** 必要なライブラリのダウンロード [#h7df8ea5]
#html(<div style="padding-left:20px;">)
|ライブラリ名|ダウンロード元|補足|h
|Jersey|https://jersey.java.net/download.html||
|jackson|http://wiki.fasterxml.com/JacksonDownload|Annotations、Streaming API、Databind の3つをダウンロード|
※ うまく動かない時は、ライブラリのバージョン等に問題がある可能性があるので [[Gradleでjarの取得だけを行う]] を参照してライブラリ取得を行ってみる。
上記の 各 jarファイルを WEB-INF/lib 配下にコピーする
#html(</div>)
*** web.xml の編集 [#ocdaa091]
#html(<div style="padding-left:20px;">)
#myhtmlcode(){{
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>mywebapp</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
</web-app>
}}
#html(</div>)
*** サービスの作成 [#n3c8faca]
#html(<div style="padding-left:20px;">)
[[上記 Gradle版のサービス作成>#uca18ee4]] と同じ
#html(</div>)
*** サービスの公開とサーバの開始 [#ef3d9893]
#html(<div style="padding-left:20px;">)
サーバを作成し、公開および開始する
#html(</div>)
#html(</div>)
** 動作確認 [#ce2d650d]
#html(<div style="padding-left:20px;">)
*** ブラウザから以下のURLにアクセスする [#cdb56b0e]
#html(<div style="padding-left:20px;">)
http://localhost:8080/mywebapp/ws/books
※一覧表示
#html(</div>)
#html(<div style="padding-left:20px;">)
http://localhost:8080/mywebapp/ws/books/1
※IDを指定して表示
#html(</div>)
#html(</div>)