JAX-RS on Wildfly 8 でhello的なもの
前回AngularJS使ってみてて、サーバ側はRESTインタフェースで構えようと思ったらJAX-RSの使い方とかよく知らないのにはたと気づいたので、Wildfly8.2でJAX-RSのhello 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>
実行
あとはこれを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コマンドではないにしても)が叩けることに驚いた。