GrailsのWebflowの - フロー・スコープの* *物事を保ちます
-
18-09-2019 - |
質問
私は何かが欠けています....
私はこのようになりますのGrailsのWebflowを持っている: -
def childFlow = {
start {
action {
def targets = []
Target.list().each {target ->
targets.add(new TargetCommand(name: target.name, id: target.id))
}
log.debug "targets are $targets"
[children: targets]
}
on('success').to('selectChild')
}
...
TargetCommandは直列化可能です。しかし、私はこのエラーを取得する: -
Caused by: java.io.NotSerializableException: com.nerderg.groupie.donate.Target
いくつかの理由Target.list(内部にある「ターゲット」オブジェクト)。各{}クロージャは、流量範囲に入れ取得され、そしてIは一時としてマークする方法を見つけ出すことができない。
私は、私は彼らがあまりにもしたくない場合にフロー・スコープに配置されたオブジェクトを持っているサービスにいくつかのコードを持っています。
私は停止するにはどうすればよいのクロージャ内のローカル変数の過渡は、フロー・スコープに置かれて?
解決
私たちは彼らと仕上げとして、我々は単純にそうように、インスタンスを立ち退か上記の回答の絞り込み代わりにのPersistenceContextをクリア
Target.list().each {
targets.add(new TargetCommand(name: it.name, id: it.id))
flow.persistenceContext.evict(it)
}
これはまだ回避策
過渡としてクロージャ変数をマークすることができないためであります他のヒント
私の質問への答えは、次のとおりです。
フローオブジェクトは、流れが私は考えコンテキストの(オブジェクトが変更されていない場合でも、セッション全体を保存しようとするようorg.hibernate.impl.SessionImplある「のPersistenceContext」への参照を含むマップであります)
のGrails 1.1.xのドキュメントからこのを間違ったの例では、私たちに何をすべきかの手掛かりを与えます:
processPurchaseOrder {
action {
def a = flow.address
def p = flow.person
def pd = flow.paymentDetails
def cartItems = flow.cartItems
flow.clear()
def o = new Order(person:p, shippingAddress:a, paymentDetails:pd)
o.invoiceNumber = new Random().nextInt(9999999) cartItems.each { o.addToItems(it) }
o.save()
[order:o] }
on("error").to "confirmPurchase"
on(Exception).to "confirmPurchase"
on("success").to "displayInvoice"
}
flow.clear()は、その後、全体の流れは、セッションの欠如に起因する失敗させるのPersistenceContextまたはセッションを含む全体のフローマップをクリアします。
中間体「溶液」なるのPersistenceContextを使用することであり、この場合には明らか。だから、これは動作します: -
def childFlow = {
start {
action {
sponsorService.updateTargetsFromTaggedContent()
def targets = []
Target.list().each {
targets.add(new TargetCommand(name: it.name, id: it.id))
}
flow.persistenceContext.clear()
[children: targets]
}
on('success').to('selectChild')
on(Exception).to 'finish'
}
これで明白な問題は、セッションがちょうど流れの中で、私はしたくないものを締め出すのではなく、完全にクリアされていることである。
より良い方法の希望のために、ここでは流れののPersistenceContextから任意の非直列化オブジェクトを削除する一般的なソリューションです。これは、サービスメソッドは、流れを与えることができます: -
def remove = []
flow.persistenceContext.getPersistenceContext().getEntitiesByKey().values().each { entity ->
if(!entity instanceof Serializable){
remove.add(entity)
}
}
remove.each {flow.persistenceContext.evict(it)}
私のようなあなたは多分すべてを立ち退かせるために必要がある場合は、あなたがやりたい
flow.persistenceContext.flush()
flow.persistenceContext.persistenceContext.clear()