BlazeDSと Springを統合する
以前のエントリで予告したとおり、Springと一緒に BlazeDSを使う方法を書きとどめておく。Springを使って組み立てられた既存の Webアプリケーションを Flexで RIA対応化へ導くのであれば、この組み合わせは避けて通れないはずだ。
ここではSpringが既に Webアプリケーションに組み込まれているものとして解説する。
つまり、web.xmlにContextLoaderListenerが登録されており、Bean定義ファイル (デフォルトでは WEB-INF/applicationContext.xml) がロードされるよう構成されていること。
Springと BlazeDSを統合するとはつまり何かというと、BlazeDSのオブジェクトファクトリとして Springを利用するよう構成するということだ。デフォルトで BlazeDSのオブジェクトファクトリは BlazeDS自体の内蔵している簡易な物だが、これを Springに置き換えれば DIや AOPの強力なサポートが得られるわけだ。
BlazeDSとSpringを接続するアダプタとなるモジュールは今のところ下記からダウンロード出来る。
http://www.igenko.org/archiva/repository/igenko/com/adobe/flex/blazeds-spring/
ここから適当に一番新しそうな blazeds-spring-*.jar を持ってきて WEB-INF/lib に入れるといいだろう。
WEB-INF/flex/services-config.xml に、オブジェクトファクトリとして Springを使えるように factory要素を登録する( services-config要素下 )
destinationやendpointをどう設定するかは以前のエントリを参照

テストは Spring 2.5.1と Flex Builder3 Beta3で行った。
日付のフォーマットをきちんとしたければ DataGridColumn.labelFunctionと mx:dateFormatterを使えば良い。
BlazeDSを介したメソッド呼び出しでは、メソッドが例外をスローしても BlazeDSがそれを捕まえて Flexアプリケーションに Faultオブジェクトとして(アプリケーションサーバから見れば)正常に返してしまうため、アプリケーションサーバ側では例外ログが出力されない。このため、例外の追跡を行えるような何らかの仕掛けをしておくのが望ましいと思う。
(例えば例外のロギングといった地味なAOPの用法はここで大きく役立つと思われる)
ここではSpringが既に Webアプリケーションに組み込まれているものとして解説する。
つまり、web.xmlにContextLoaderListenerが登録されており、Bean定義ファイル (デフォルトでは WEB-INF/applicationContext.xml) がロードされるよう構成されていること。
Springと BlazeDSを統合するとはつまり何かというと、BlazeDSのオブジェクトファクトリとして Springを利用するよう構成するということだ。デフォルトで BlazeDSのオブジェクトファクトリは BlazeDS自体の内蔵している簡易な物だが、これを Springに置き換えれば DIや AOPの強力なサポートが得られるわけだ。
BlazeDSとSpringを接続するアダプタとなるモジュールは今のところ下記からダウンロード出来る。
http://www.igenko.org/archiva/repository/igenko/com/adobe/flex/blazeds-spring/
ここから適当に一番新しそうな blazeds-spring-*.jar を持ってきて WEB-INF/lib に入れるといいだろう。
WEB-INF/flex/services-config.xml に、オブジェクトファクトリとして Springを使えるように factory要素を登録する( services-config要素下 )
続いてサービス定義の中、destination要素のプロパティに注目。
<factories>
<factory id="spring"
class="flex.messaging.service.SpringFactory"/>
</factories>
のように、クラス名を直接指定している部分を
<properties>
<source>com.acme.MyService</source>
</properties>
のように、Springの Bean IDを使ってオブジェクトを取得するように書き換える。この際、Springの WEB-INF/applicationContext.xmlには下記のような Bean定義が必要となる(むろん実際にはこの Beanに対して property 要素で依存コンポーネントをあれこれ注入する形になるだろう)。
<properties>
<factory>spring</factory>
<source>myService</source>
</properties>
<bean id="myService" class="com.acme.MyService"/>こうすることで、Springによってインスタンス生成と依存性注入が行われ完成したオブジェクトを BlazeDSを通じて Flexアプリケーションに向けて公開することが出来る。
日付範囲から勤務時間表を出力する Flexアプリケーションの例。
Java側
/**
* Java側メソッド - 指定した日付範囲の勤務時間を抽出する
* from: 開始日付
* to: 終了日付
* 前提条件: JDBCデータソース dataSource が セットされている
*/
public List getWorks(java.sql.Date from, java.sql.Date to)
{
/*
JdbcTemplate#queryForList でSQLを実行し、結果(MapのList)を
そのまま Flex側に返す(ObjectのArrayCollectionへとうまい具合に変換される)。
*/
return new
JdbcTemplate(dataSource).queryForList(
"select 日付,勤務時間 from 勤務表 where 日付>=? and 日付<=?",
new Object[] {from, to});
}
Flex側
destinationやendpointをどう設定するかは以前のエントリを参照
<mx:RemoteObject id="srv" destination="amftest"
endpoint="http://localhost:8080/amftest/messagebroker/amf"/>
<mx:HBox>
<mx:DateField id="from"/><mx:Label text="から"/>
<mx:DateField id="_to"/><mx:Label text="まで"/>
<mx:Button label="検索実行"
click="srv.getWorks(from.selectedDate, _to.selectedDate)"/>
</mx:HBox>
<mx:DataGrid dataProvider="{srv.getWorks.lastResult}">
<mx:columns>
<!-- ActionScriptでは日本語名のプロパティも通るようだ
勧めはしないが -->
<mx:DataGridColumn dataField="日付" width="300"/>
<mx:DataGridColumn dataField="勤務時間" width="60"/>
</mx:columns>
</mx:DataGrid>
実行画面

テストは Spring 2.5.1と Flex Builder3 Beta3で行った。
日付のフォーマットをきちんとしたければ DataGridColumn.labelFunctionと mx:dateFormatterを使えば良い。
メモ
BlazeDSを介したメソッド呼び出しでは、メソッドが例外をスローしても BlazeDSがそれを捕まえて Flexアプリケーションに Faultオブジェクトとして(アプリケーションサーバから見れば)正常に返してしまうため、アプリケーションサーバ側では例外ログが出力されない。このため、例外の追跡を行えるような何らかの仕掛けをしておくのが望ましいと思う。
(例えば例外のロギングといった地味なAOPの用法はここで大きく役立つと思われる)

0 件のコメント:
コメントを投稿
<< ホーム