* 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>)

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS