カスタム検索

2008年8月4日月曜日

「Grails+BlazeDS」を鍛える

Grails+BlazeDSでデータを取得する時の話

・hasManyしているドメインをとろうとすると、型をキャストしようとした所でFlexからSessionナイヨーって怒られる

基本lazyモードなんで、データを取得しようとした時にFlex側からHibernateのSessionがとれないっぽい
web.xmlに以下の内容を追記してやる事で解決


<filter>
<filter-name>sessionView</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>sessionView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


他にも criteria を使って eager で読み込んでやるとか、domainでeager にしておくとかでも良い、メモメモ

def criteria = Item.createCriteria()
def items = criteria.listDistinct{
fetchMode('contents', FM.EAGER)
}


・hasManyしたフィールドの扱い

hasManyしたドメインはarrayCollectionとしてくるので、Flex側のクラスを合わせておく。


public var contents:ArrayCollection;


他にも grails的にくっつくものをつけておくと、警告が出なくて幸せ。

public var id:int;
public var version:int;
public var metaClass:Object;


・hasManyしたドメインがオートキャストされない

Object扱いになっている、自前でキャストしてやる事は可能

for(var c:Number=0;item.contents.length > c; c++) {
var contents:Content = Content(item.contents[c]);
}

なぜかこのコードは書いておくだけで、実行される前にキャストされている。謎い。キモい。

2008年7月17日木曜日

BlazeDSヤバイ。まず広い。

grails + blazeDs なテスト

・適当なアプリを作成
grails create-app flexremote
cd flexremote

・flex pluginをインストール
grails install-plugin flex

・サービスを作成


class BookService {
static expose = ['flex-remoting']

def getBooks() {
return Book.list();
}
}


expose = ['flex-remoting']
にしておくと flex plugin が自動的に amf を配備してくれる。
これをFlex(AIR)側 remoteObject として定義してやると、サービスの中のメソッドが自由に呼べるようになる。


<mx:RemoteObject id="srv"
destination="bookService"
endpoint="http://localhost:8080/flexremote/messagebroker/amf"
result="resultHandler(event)"
fault="faultHandler(event)" />

<mx:Script>
<![CDATA[
srv.getProducts();
]]>
</mx:Script>



desitination はサービス名、endpoint に amf のURLを指定。
GrailsのDomainと同じフィールドを持つ class を作成しておけば、自動的にバインドされてハッピー。

ココにすばらすぃサンプルがあります。

さっくり速度検証もしてみました。
10000件のデータを同じGrailsアプリから blazeDS , WebService , Http(JSON)で投げてみました。

結果は blazeDS の圧勝。

WebServiceも通信部分だけなら早かったんですが、Modelにバインドすると結局 blazeDS の倍ぐらいかかります。
JSONは通信もバインドもかなり差をつけられた感じです、、、
まぁモデルをStringに置き換えてStringをパースして更にモデルにしてと明らかにステップ数が多いのでしょうがないですね。