RESTEasyを使って、JavaでもカンタンRestful
RESTEasyが、最新のSeamに含まれているということなので、試してみた。用意したのは、
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は、ルートにもあるので注意)。太線にしたところを変更する。
...次にWEB-INF/web.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>
<?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が苦手なサービス系も、これを使うと簡単できそう。





