はじめに
前回は、CurlがJSONをサポートするようになった紹介も兼ねて、Javaで作成したサーバーサイドとJSON形式で通信を行うアプリケーションの作成を行いました。
今回は、JSON形式ではなく、「Curl ORB for Java」というOSSのライブラリを使用して、CurlアプリケーションからPOJO(Plain Old Java Object)のメソッドをコールするCurlアプリケーションを作成する手順を紹介します。
ただし、今回の内容は、既にCodeZineに類似記事(Curl ORB for javaによるサーバ連携)が存在するため、補足する内容や、DIコンテナにSeasar2を利用する場合の留意点等の紹介を行いたいと思います。
これまでの記事
Curl ORB for Java
Curl ORB for Javaとは
Curl ORB for Javaとは、POJO(Plain Old Java Object)として作成されたサーバサイドのJavaクラスをCurlから簡単にコールできるツールです。
ORBとは、Object Request Brokerの略で、分散コンピューティングにおいて、ネットワークを介してコンピュータ間でのプログラムの呼び出しを可能とするミドルウェアのことです。サーバからプッシュする機能はありませんが、BlazeDSやS2Flex2のような機能を提供すると言った方が分かりやすい読者もいるのではないかと思います。
主要機能としては、次の機能が挙げられています。
- サーバサイドオブジェクトのメソッド実行
- ハイパフォーマンス
- 複数データ型のサポート
- DIコンテナ統合
- ソースコード・ジェネレータ
Curl ORB for Javaは「Apache License 2.0」の下、オープンソース・ソフトウェアとして提供されており、SourceForge.netからダウンロードできます。執筆時点でのバージョンは、0.5 stableとなっています。
現在、Curl ORB for JavaとSeasar2を組み合わせて使用した際に、「Generator Wizardのリストにコンポーネントが表示されない」「Generator Wizardに表示されるクラス名が違う」などの問題が確認されております。この問題を解決したCurl ORB for Java最新版がCurl Developer Centerからダウンロードが可能です(ダウンロードページはこちら)。
開発手順
Curl ORB for Javaを使用した場合の、開発手順は次のようになると考えられます。
- Javaサービスクラスなどを作成
- web.xml等にCurl ORB for Javaの設定を行い、サーバを起動
- Curlクライアントを使用し、作成したJavaサービスクラス等からCurlサービスクラス等のコードを自動生成
- 作成したCurlサービスクラスのメソッドを呼び出すコードをCurl側に記述する
Curlコードの自動生成 1
サーバーサイドの準備
サーバーサイドでの準備は、コードの記述と、web.xml、curl-config.xmlの設定です。コードは、前回作成したEmpServiceなどを利用することとします。
Curl ORB for Java固有の設定をweb.xmlに追記する必要があります。設定を行ったweb.xmlは次のようになります。下記のソースコードでは、S2Servletの記述をコメントアウトしていますが、これについては後述します。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> ~中略~ <filter> <filter-name>DefaultFilter</filter-name> <filter-class>com.curlap.orb.servlet.DefaultInstanceManagementFilter</filter-class> </filter> <filter-mapping> <filter-name>DefaultFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>InvokeInContextServlet</servlet-name> <servlet-class>com.curlap.orb.servlet.InvokeInContextServlet</servlet-class> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>InvokeInContextServlet</servlet-name> <url-pattern>/invoke-in-context</url-pattern> </servlet-mapping> <servlet> <servlet-name>NewInstanceServlet</servlet-name> <servlet-class>com.curlap.orb.servlet.NewInstanceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>NewInstanceServlet</servlet-name> <url-pattern>/new-instance</url-pattern> </servlet-mapping> <servlet> <servlet-name>InvokeServlet</servlet-name> <servlet-class>com.curlap.orb.servlet.InvokeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>InvokeServlet</servlet-name> <url-pattern>/invoke</url-pattern> </servlet-mapping> <servlet> <servlet-name>DestroyInstanceServlet</servlet-name> <servlet-class>com.curlap.orb.servlet.DestroyInstanceServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DestroyInstanceServlet</servlet-name> <url-pattern>/destroy-instance</url-pattern> </servlet-mapping> ~中略~ <!-- <servlet> <servlet-name>s2servlet</servlet-name> <servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>s2servlet</servlet-name> <url-pattern>/s2servlet</url-pattern> </servlet-mapping> --> </web-app>
Seasar2をDIコンテナに利用する場合には、次のようにcurl-config.xmlのSeasar2ApplicationContextを有効にします。curl-config.xmlは、web.xmlと同じディレクトリ内に配置します。
<?xml version="1.0" encoding="UTF-8"?> <!-- Curl ORB Configuration file --> <curl-config> <!-- ApplicationContext ServletContext(default), spring2, seasar2 --> <!-- Spring2 --> <!-- <application-context name="spring2" class="com.curlap.orb.context.Spring2ApplicationContext" /> --> <!-- Seasar2 --> <application-context name="seasar2" class="com.curlap.orb.context.Seasar2ApplicationContext" /> <!-- ACL(Access control list) --> <access-control-list> <allow class="*" /> </access-control-list> </curl-config>
通常、S2コンテナの初期化処理はS2Servletによって行われますが、Curl ORB for Javaでは、Seasar2ApplicationContextによってS2コンテナの初期化処理が行われます。仮に、web.xmlにS2Servletの記述が有効であれば、初期化処理が2度行われてしまいます。そのため、web.xmlのS2Servletに関する箇所をコメントアウトしています。
また、Webアプリケーションは、次のURLでアクセス可能な箇所に配置する必要があります。
- http://localhost:8080/curl-orb-server/
これは、Curlクライアントのコードを生成するときの制限となっています。また、Curl ORB for Java実行時に利用されるデフォルトのURLでもあります。
Curlコードの自動生成
Webアプリケーションを起動したあとに、「Curl ORB - Code Generator Wizard(以下、Generator Wizard)」を起動します。curl-orb_0.5_stable_binに含まれるcode-generator.dcurlはデスクトップアプリケーションなので、ダブルクリックすることで起動できます。起動すると次のような画面が表示されます。
Service Class(DI)を選択し、「Next」ボタンをクリックします。
生成対象を選択し、「Next」ボタンをクリックします。
インターフェースを選択し、「Next」ボタンをクリックします。
生成するメソッドなどを選択し、「Class File」でコードの出力場所指定し、「Generate」ボタンをクリックするとコードが生成されます。
さらに、Generator Wizardの最初の画面で、「Data Class」や「Exception Class」から必要なクラスに関しても同様の手順でコード生成を行います。
Curlコードの自動生成 2
生成コードの説明
ウィザードが完了すると、次のようなコードが生成されます。
||| ||| NOTE: *** This code was generated by the Curl code generator automatically *** ||| || PACKAGE SAMPLE.SERVICE {import * from COM.CURLAP.ORB.SERVLET} {import * from SAMPLE.ENTITY} {import * from SAMPLE.QUERY} {define-class public EmpService {inherits ORBClientForContext} {constructor public {default} {construct-super.ORBClientForContext "empService"} } {method public {find v0:EmpQuery}:#Array {return {self.invoke "find", arguments = {FastArray v0}}} } ~中略~ }
15行目の"empService"が、Seasar2で管理されているコンポーネント名と一致することが確認できます。
まとめ
今回は、Curl ORB for Javaの概要と手順、それにいくつかの留意点について説明しました。Curl ORB for Javaの詳細については、参考リンクを参照してください。