3

何かが足りない…。

次のようなGrailsWebフローがあります:-

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()。each {}クロージャー内にある「ターゲット」オブジェクトがフロースコープに入れられており、一時的なものとしてマークする方法がわかりません。

フロースコープにオブジェクトを配置したくないときに、オブジェクトを配置するコードがサービスにあります。

フロースコープに配置されているクロージャのローカル一時変数を停止するにはどうすればよいですか?

4

4 に答える 4

3

persistenceContext をクリアする代わりに上記の答えを改良すると、次のように、インスタンスを使い終わったときに単純にインスタンスを削除します。

    Target.list().each {
        targets.add(new TargetCommand(name: it.name, id: it.id))
        flow.persistenceContext.evict(it)
    }

これは、クロージャー変数を一時的なものとしてマークできない場合の回避策です。

于 2009-11-07T07:25:17.753 に答える
2

私の質問に対する答えは次のとおりです。

フローオブジェクトは、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'
        }

これに関する明らかな問題は、フローで不要なものを除外するだけでなく、セッションが完全にクリアされることです。

于 2009-11-07T07:12:37.483 に答える
0

私のように、あなたがやりたいことをすべて追い出す必要があるなら

flow.persistenceContext.flush()
flow.persistenceContext.persistenceContext.clear()
于 2012-10-18T09:43:32.960 に答える