hatenob

プログラムって分からないことだらけ

JAX-RS on Wildfly 8 でhello的なもの

前回AngularJS使ってみてて、サーバ側はRESTインタフェースで構えようと思ったらJAX-RSの使い方とかよく知らないのにはたと気づいたので、Wildfly8.2でJAX-RShello world的なものを試してみました。
いやほんと、今更ながらそんなレベルです。

Java

Javaのコードはいたってシンプル。戻りを自身で定義したクラスにしてあるのは、JSONで返す時にこうしておくと勝手に「プロパティ名: 値」でJSONに変換して返してくれるからです。最初Stringにしてたら、単に文字列だけ返ってしまってはたと気づいた。

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("hello")
public class HelloService {
    @GET
    @Path("{word}")
    @Produces(MediaType.APPLICATION_JSON)
    public Hello world(@PathParam("word") String word) {
        Hello h = new Hello();
        h.setWord(word);
        return h;
    }

    private class Hello {
        private String word;

        public String getWord() {
            return "hello " + this.word;
        }

        public void setWord(String word) {
            this.word = word;
        }
    }
}

web.xml

Servletみたいにアノテーション付けただけで勝手にエンドポイントとして設定されるかと思いきや、ちゃんとServlet定義を書かないとダメなようです。
1つ1つに書く必要はなくて、親Servlet的なものだけ書いておけば大丈夫です。このあたりはJSFとかも一緒ですよね。

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">

    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/rs/*</url-pattern>
    </servlet-mapping>

</web-app>

補記

web.xmlを書かなくても、Applicationクラスのサブクラスを作って、@ApplicationPathアノテーション付けたら大丈夫そうです。

実行

あとはこれをwarにしてWildflyにデプロイしたら動きます。
プロファイルは普通にWebプロファイル(standalone.xml)で大丈夫でした。
今回の場合だとURLはこんな感じです。

http://hostname:port/context-root/rs/hello/{word}

{word}の部分に、好きな文字列を指定すると、「hello {word}」という文字列が返されるという感じです。

実行例はこんな感じです。(Powershellから実行)

PS > curl http://localhost:8080/chanko-angularjs/rs/hello/rest

StatusCode        : 200
StatusDescription : OK
Content           : {"word":"hello rest"}
RawContent        : HTTP/1.1 200 OK
                    Connection: keep-alive
                    Transfer-Encoding: chunked
                    Content-Type: application/json
                    ...()

Powershellからcurlコマンド(実際にはInvoke-WebRequestのエイリアスなので本当のcurlコマンドではないにしても)が叩けることに驚いた。