ひこぽんのーと

覚書と雑記です。

JavaEE 7をやってみよう。 JAX-RS その1

むか〜し、仕事でJAX-RSを使ってWebAPIを作ったりしたことがあって、
こんなの余裕だろって思ったのだけど、
すっかり忘れてしまっていて、
初歩の初歩さえ、ままならなかった。
無念。

しかたなく、今回も1から思い出せるように、
JAX-RSのサンプルを書いてみた。

まずは、プロジェクトにJAX-RSとJAXBのファセットを追加した。

1. プロジェクトのプロパティからプロジェクト・ファセットを選択する。
JAX-RSとJAXBのチェックをつける。
f:id:nagamitsu1976:20150807171551p:plain

つづいて、Webサービスを作ってみる。

2. 新規ウィザードから[webサービス] - [JAX-RS Application]を選ぶ
f:id:nagamitsu1976:20150807172743p:plain
3. アプリケーションの情報を入力する。
ソースフォルダ、パッケージ、名前は、Javaクラス作成と同じ要領で入力する。
アプリケーションパスについては、RESTアプリケーションを表すURIとなるので、それを踏まえて決める。
ここではわかりやすくrestとした。f:id:nagamitsu1976:20150807172811p:plain
4. 完了ボタンを押すと、クラスが自動生成される。
package jaxrs;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/rest")
public class RestApplication extends Application {

}

続いて、JAX-RS Resourceを作ってみる。
ウィザードからでも作れるが、簡単なので手作りする。
とりあえず、URLを叩いたら文字列を返すようなものを作ってみる。

package jaxrs;

import javax.enterprise.context.RequestScoped;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@RequestScoped
@Path("ship")
public class ShipResource {
    
    @GET
    @Produces("text/plain")
    public String getText() {
        return "This is user!";
    }

}

サーバーを起動し、http://localhost:8080/{アプリケーション名}/rest/shipでアクセスすると
想定通り文字列が返される。
URIの"rest"はRestApplicationクラスの@ApplicationPathで指定したものであり、
"ship"はShipResourceクラスの@Pathで指定したものとなっている。
RESTではアプリケーションクラスのアプリケーションパス+リソースクラスのパスを指定することで
メソッドの実行が可能となっている。
f:id:nagamitsu1976:20150807174602p:plain

また、リソースクラスのメソッドに付けたアノテーションが重要。
@GETアノテーションURIの参照がGETで行われた場合に実行する、という意味であり、
POSTの場合に実行したいならば、@POSTを用いる。
HTTPメソッドの数だけアノテーションも用意されているが、
GET, POST以外のDeleteだとかはあまり使われているのを見たことがない。

@Producesアノテーションは、メソッドの実行結果のメディアタイプを表す。
この場合は"text/plain"を指定した事でテキストでレスポンスが返されたが、
jsonで返したい場合は、"application/json"を
xmlで返したい場合は、"application/xml"を指定する事になる。

といった具合で、その2へ続く。