読者です 読者をやめる 読者になる 読者になる

ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

読んだ: 『Java による RESTful システム構築』

書籍 Java

JavaによるRESTfulシステム構築

JavaによるRESTfulシステム構築

タイトルからはわかりませんが、JAX-RS について書かれた書籍です。 著者の Bill Burke さんは、JAX-RS 仕様の策定や JAX-RS 実装 RESTEasy の開発に関わっている人です。

さすがに仕様策定や実装の開発に関わっている人が書いているだけあって、JAX-RS についての重要なことがらがわかりやすくまとまっていました。 JAX-RS について学ぶのであればまず本書を読むのが一番だと思います。

JAX-RS について

JAX-RS というのは、RESTful サービスを構築するための JavaAPI 仕様です (JSR 339)。 JAX-RS より前の Java での web アプリケーション開発といえばサーブレットがなじみ深いですが、サーブレットを使う場合は HTTP リクエストやレスポンスとのやり取りが煩雑になりがちでした。 そこで、RESTful サービスの実装を簡素化するために JAX-RS 仕様が定義されたそうです。

本書では、JAX-RS について以下のように説明されています。

JAX-RS は、プレーン (普通の) Java オブジェクトに対する Java アノテーションの適用に特化したフレームワークである。 JAX-RS には、特定の URI パターンと HTTP 操作を Java クラスの個々のメソッドにバインドするためのアノテーションが用意されている。 HTTP リクエストから情報を容易に引き出せるようにパラメータインジェクションアノテーションが用意されている。 また、自作の Java データオブジェクトからデータフォーマットのマーシャリングおよびアンマーシャリングを分離するためにメッセージボディのリーダーとライターが用意されている。 ...

アノテーション」 が重要なキーワードで、受け取った HTTP リクエストの URI やリクエストメソッドに応じて実際に呼び出されるメソッドがどのクラスのどのメソッドなのかを、アノテーションを用いて宣言的に記述するようになっています。

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;

@Path("/user")
public class UserResource {
    @GET
    @Path("{id}")
    @Produces("application/json")
    public Response getUser(@PathParam("id") int id) {
        // ... 処理 ...
    }
}

上の例は、/user/324 みたいなパスに対する GET リクエストを受け取るメソッドの宣言です。 パスに含まれるユーザー ID の部分を、メソッドの引数として int 型で受け取れるようになっています。

ルーティングの処理 *1 や、HTTP リクエストからの値の取り出し、HTTP レスポンスの構成といった部分が JAX-RS の担当範囲だと言えるでしょう *2

JAXB の組み込みサポート

HTTP レスポンスのボディとして XML や JSON を返したいことが多々あります。 JAX-RS には組み込みの JAXB サポートがあり、単に特定の形式の Java オブジェクト (Java Bean) をレスポンスとして指定するだけで、自動的に XML や JSON に変換してくれます。

JAXB というのは JAX-RS 以前から存在する Javaアノテーションフレームワーク仕様で、Java クラスを XMLXML スキーマにマッピングするものです。 JAXB には XML 以外のフォーマットをサポートする柔軟性があって、アダプタによって JSON などもサポートされているようです。 本書では、詳細には立ち入らないものの、JAX-RS を使う際に必要そうな JAXB についての説明もある程度なされています。

その他いろいろ

本書では、JAX-RS 仕様についても他にもいろいろ説明されていますし、JAX-RS 仕様以外の REST の概念の説明や、REST のクライアントサイドの Java における実装の紹介などもあり、充実した内容になっています。 本書の後半には、JAX-RS 実装のひとつである RESTEasy を使った RESTful サービスのサンプルの説明がありますので、

本書を読むための前提知識

なんとなくタイトルからは 「Java さえ書ければ本書を読めば RESTful サービスが作れそう」 という印象を受けますが、実際のところは Java を書けるというだけでは知らないであろう単語が随所に出てきて、難易度は高めだと感じました。 具体的には 「サーブレットコンテナ」 とか 「JavaBeans」 などです。

もちろんそれらを詳しく知らないと読み進められないわけではないので、調べながら読むとか、使ったことはなくても大体どんなものかは知っているという状態で読むのであれば大丈夫だとは思いますが、Javaサーブレット周りの知識を全然持っていない人が 「これさえ読めば web サービスを作れるようになる!」 みたいな気持ちで本書を読むと挫折するような気がします。

本書の感想

JAX-RS の説明に関しては、本書はわかりやすく非常に良かったと思います。 単に仕様を説明するだけではなく、どういう思想でこうなっているのかなども説明されたりしていて、そのような点も理解の助けになりました。

一方で、上にも書いたように Java のエンタープライズ系 (?) の人を主な対象読者としているようで、そこら辺の知識がない私にとっては、少しハードルが高かったなーという印象です。 それでも本書を読んで Java で簡単な web サービスを作れるようにはなったので、Java で web サービスを作りたい人には本書をおすすめします!

JAX-RS とか JAXB について思ったこと

まだ触り始めたばかりなのでなんとも言えないんですが、JAX-RSアノテーションでメソッドディスパッチのルールを記述したりとか、JAXB で暗黙的に Java オブジェクトを変換したりするのって、Java の良さ (わかりやすさ) を損なうんじゃないかなー、と思ったりしました。 便利なのは便利なんですけどね。しばらく使ってみた感じでは、リソースクラスのクラス名の規約などをある程度しっかり決めておけばわかりにくさを損なうことはないなーと思いました。

*1:受け取った HTTP リクエストに対して、実際に呼び出すメソッドを決定すること。

*2:Perl でいうところの PSGIRuby でいうところの Rack にルーターの仕様を合わせたもの、という感じを思えば想像しやすそうです。