<< 2009/01/13 | Home | 2009/01/15 >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

RESTEasyを使って、JavaでもカンタンRestful

RESTEasyが、最新のSeamに含まれているということなので、試してみた。用意したのは、

  • jboss-seam-2.1.1.GA
  • jboss-4.2.3.GA

  • JBossとSeamのインストールは、ガイドが山のようにあるので、サクっと省略。といったって展開して、Seamのルートにあるbuild.propertiesに、jboss.homeの場所を指定するだけだけど。

    で、環境構築が、面倒なのでSeamのexampleディレクトリにある、registrationのサンプルを、restにコピーしてやって、その名を書き替えて試すことにする。

    その前に、scannotationライブラリが、なぜかSeamには同梱されていないので、別途入手しておく。zipを展開すると、scannotation-1.0.2.jarが入っているので、これを、Seamのlibディレクトリにコピー。

    次に、Seamのexamplesの下にある、build.xmlに、RESTEasyへの対応を入れる(build.xmlは、ルートにもあるので注意)。太線にしたところを変更する。

    ...
    <fileset id="seam.ui.jar" dir="${lib.dir}">
    <include name="jboss-seam-ui.jar" if="seam.ui.lib" />
    <include name="commons-beanutils.jar" if="seam.ui.lib" unless="richfaces.lib" />
    </fileset>

    <!-- REST -->
    <fileset id="seam.rest.jar" dir="${lib.dir}">
    <include name="jboss-seam-resteasy.jar" if="seam.rest.lib" />
    <include name="resteasy-jaxrs.jar" if="seam.rest.lib" />
    <include name="jaxrs-api.jar" if="seam.rest.lib" />
    <include name="scannotation-1.0.2.jar" if="seam.rest.lib" />
    </fileset>

    ...
    <copy todir="${ear.dir}/lib">
    <fileset refid="richfaces-api.jar" />
    <fileset refid="ear.lib.extras" />
    <fileset refid="seam.rest.jar" /> <!-- REST -->
    <fileset refid="jboss-el.jar" />
    <fileset refid="cglib.jar" />

    次にコピーしたrestのディレクトリに行き、build.xmlを変更。

    <?xml version="1.0"?>

    <project name="Rest" default="deploy" basedir=".">

    <!-- Example name -->
    <property name="Name" value="Seam Restfull Example"/>
    <property name="example.name" value="jboss-seam-restful"/>

    <!-- Libraries -->
    <property name="seam.ui.lib" value="yes"/>
    <property name="facelets.lib" value="yes"/>
    <property name="seam.rest.lib" value="yes"/> <!-- REST -->

    <import file="../build.xml"/>

    </project>

    resourcesの下にある設定ファイル類を修正する。まず、META-INF/application.xml

    <module>
    <web>
    <web-uri>jboss-seam-restful.war</web-uri>
    <context-root>/seam-restful</context-root>
    </web>
    </module>
    <module>
    <ejb>jboss-seam-restful.jar</ejb>
    </module>
    <module>
    <ejb>jboss-seam.jar</ejb>
    </module>
    次にWEB-INF/web.xml。ここは全面書き直し。

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app version="2.5"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

        <context-param>
          <param-name>resteasy.jndi.resources</param-name>
          <param-value>jboss-seam-restful/RegisterAction/local</param-value>
        </context-param>

        <context-param>
          <param-name>resteasy.scan</param-name>
          <param-value>true</param-value>
        </context-param>

        <listener>
          <listener-class>org.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
        </listener>

        <servlet>
          <servlet-name>Resteasy</servlet-name>
          <servlet-class>org.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
        </servlet>

        <servlet-mapping>
          <servlet-name>Resteasy</servlet-name>
          <url-pattern>/*</url-pattern>
        </servlet-mapping>
    </web-app>

    設定は以上。いよいよロジックを書く。ソースの下のRegister.javaに、メソッドを追加。

    package org.jboss.seam.example.registration;

    import javax.ejb.Local;

    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.ProduceMime;
    import javax.ws.rs.PathParam;

    @Local
    @Path("/customer")
    public interface Register
    {
       public String register();

        @GET
        @Path("/{id}")
        @ProduceMime("text/plain")
        public String getCustomer(@PathParam("id") int id);

    }

    @Pathは、クラスとメソッドに指定できる。ProduceMimeは、返す結果のMIMEタイプ。@PathParamを使うと、パスに指定したパラメータを受け取ることができる。実装する。RegisterAction.java。

    @Stateless
    public class RegisterAction implements Register
    {
    ...
        public String getCustomer(int id) {
            System.err.println("*** getCustomer() called.");
            return "Hello " + id;
        }


    今回はテストなので、メッセージを返すだけにする。あとは、ant実行して、JBossにデプロイしてやる。

    http://localhost:8080/seam-restful/customer/123

    をリクエストすると、ブラウザに、
    Hello 123

    と表示されるはず。

    web.xmlに若干の設定が必要だけど、ここの設定は、最初に1回しておけば良い。それ以外の配備先のパスなどの情報は、全てアノテーションなんで、開発中は設定ファイルをいじらずに済みそう。JSFが苦手なサービス系も、これを使うと簡単できそう。
    このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
    日本アイ・ビー・エム 花井 志生 Since 1997.6.8