Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

JAX-RSを使ったWebサービスのカスタマイズ

Java EE 6 開発入門(9)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2013/06/19 14:00

 本連載は、Java Enterprise Edition 6(Java EE 6)の導入方法をはじめとして、新導入された仕様や概念を紹介していきます。今回はNetBeans IDEを使い、JAX-RSを使ったWebサービスを作成とカスタマイズについて紹介します。

目次

対象読者

  • Java EE開発に興味ある方
  • これからJavaのWebアプリケーション開発をはじめる方

リソースクラスの作成で自動生成されるもの

 Webサービスを作成すると、Webサービスを定義するリソースクラスUserResource.javaとそれ以外に自動生成されるクラスがあります。NetBeansではリソースクラスに対してWebサービス定義のアノテーションを生成し、さらにJAX-RS用のアプリケーション定義用のクラスも生成します。

JAX-RSで定義可能なアノテーション

 前回作成したリソースクラスは、自動的に@Pathや@GETなどのアノテーションが作成されています。以下にアノテーション一覧を示します。

表1 JAX-RSで定義可能なアノテーションと用途
アノテーション 定義対象 用途
@Path クラス クラスのURIを定義。
@GET メソッド HTTPメソッドのGETから呼び出され、リソースの取得を記述する。
@POST メソッド HTTPメソッドのPOSTから呼び出され、リソースの更新を記述する。
@PUT メソッド HTTPメソッドのPUTから呼び出され、リソースの新規追加を記述する。
@DELETE メソッド HTTPメソッドのDELETEから呼び出され、リソースの削除を記述する。
@HEAD メソッド HTTPメソッドのHEADから呼び出される。
リソースが存在するか確認するために利用。
@Consumes メソッド クライアントから受信するコンテンツタイプを定義。
@Produces メソッド クライアントへ送信するコンテンツタイプを定義。
@PathParam メソッド引数 リソースのパラメータ部分に対して定義する。
@QueryParam メソッド引数 HTTPリクエストのクエリパラメータに対するリソースへ記載する。
@Provider メソッド @Consumesや@Producesで定義するコンテンツタイプへ送受信する
クラスであることを宣言する。単純な文字列以外にもbyte[]やファイル入出力、
データソース、XML、ストリーミング出力が設定可能になる。

 公開するWebサービスに応じてメソッドを追加し、そのメソッドの役割にあったアノテーションを付記していくと、Webサービスとして公開可能になります。

アプリケーション定義

 前回作成したWebサービスのURI「http://localhost:8080/SampleApp/webresources/user」に含まれている/webresourcesのパスは、RESTful Webサービスでリソースを作成した際にウィザードが自動生成するソースパッケージに含まれる「org.netbeans.rest.application.config」パッケージのApplicationConfig.javaで設定しています。NetBeansはこれを自動的に生成し、GlassFishサーバが自動的に読み込んでいます。なお、このクラスは編集しません。

リスト4 自動生成される設定クラス ApplicationConfig.java
package org.netbeans.rest.application.config;

import java.util.Set;
import javax.ws.rs.core.Application;

@javax.ws.rs.ApplicationPath("webresources") …(1)
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        return getRestResourceClasses();
    }

    /**
     * Do not modify this method. It is automatically generated by NetBeans REST support.
     */
    private Set<Class<?>> getRestResourceClasses() {
        Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
        resources.add(sample.webservice.UserResource.class);
        try {
            Class<?> jacksonProvider = Class.forName("org.codehaus.jackson.jaxrs.JacksonJsonProvider");
            resources.add(jacksonProvider);
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        return resources;
    }
}

 (1)の部分で、@javax.ws.rs.ApplicationPath("webresources")と設定されています。これが先ほどのURIに含まれるJAX-RS用のパスとして作用します。

リソース取得とパス定義

 次にリソース取得のパス定義について紹介します。従来のサーブレットを使ったWebアプリケーションではクエリ文字列や入力フォームから送信するパラメータで対象のデータを指定して取得していますが、RESTの場合はこれらもパスで指定して、URIの一部とします。

 具体的な例を挙げて説明しましょう。例えば、ユーザー情報を検索し表示するサービスを用意し、サーバーへ送信されるパラメータはユーザーを一意に決定するユーザーIDを指定すると定義します。このリソースを定義するURIは次のようになります。

  • http://localhost:8080/SampleApp/webresources/user/[ユーザ-IDの値]

 このリクエストを受け取るクラスは次のようになります。

リスト5: 特定ユーザーリソースを返す UserResource.java
@Path("user/{userid}")
public class UserResource {
    …(省略)…
}

 URIが/user/ユーザーIDですので、クラスに付ける@Pathの値も変更します。追加した{userid}はuserの後ろに付けることを宣言しているため、userの次のパスはユーザーIDを示すリソースになります。そこで実際にこのユーザーIDを受け取るメソッドは、次のようになります。

リスト6 特定ユーザーリソースを返すGETメソッドを実装した UserResource.java
@Path("user/{userid}")
public class UserResource {
    …(省略)…
    @GET
    @Produces("text/plain")
    public String getText(@PathParam("userid") String id ) { …(1)
        return "This is JAX-RS Message,userid is " + id;
    }
}

 (1)の部分、メソッドの引数で@PathParamアノテーションとそれを受け取る引数を定義しています。@PathParamで定義しているのは、リクエストされたURIのパスの中にある「userid」をメソッドの引数であるidに紐づけています。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 東 浩二(アズマ コウジ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:Java EE 6 開発入門

もっと読む

All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5