Grails Webflow - إبقاء الأشياء *خارج* نطاق التدفق

StackOverflow https://stackoverflow.com/questions/1691853

  •  18-09-2019
  •  | 
  •  

سؤال

انا مشتاق لشيئ ما....

لدي تدفق ويب Grails يبدو كما يلي: -

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 {} في نطاق التدفق، ولا يمكنني معرفة كيفية وضع علامة عليه على أنه عابر.

لدي بعض التعليمات البرمجية في الخدمة التي تحتوي على كائنات موضوعة في نطاق التدفق عندما لا أريدها أيضًا.

كيف يمكنني إيقاف وضع المتغيرات المؤقتة المحلية في عمليات الإغلاق في نطاق التدفق؟

هل كانت مفيدة؟

المحلول

تكرير الإجابة المذكورة أعلاه بدلا من تطهير persistencecontext نحن ببساطة طرد الحالات ونحن ننتهي معهم، مثل ذلك:

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

هذا لا يزال عمل حول عدم القدرة على تحديد متغيرات الإغلاق باعتباره عابرا

نصائح أخرى

الجواب على سؤالي هو:

كائن التدفق عبارة عن خريطة تحتوي على مرجع إلى "persistenceContext" وهو org.hibernate.impl.SessionImpl لذا يحاول التدفق تخزين الجلسة بأكملها، حتى لو لم يتم تغيير الكائنات (للسياق الذي أفترضه)

هذا غير صحيح مثال من Grails 1.1.x doc يعطينا فكرة عما يجب فعله:

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() بمسح خريطة التدفق بأكملها بما في ذلك استمرارية المحتوى أو الجلسة، مما يؤدي بعد ذلك إلى فشل التدفق بالكامل بسبب عدم وجود جلسة.

لذا فإن "الحل" الوسيط هو استخدام الثبات وفي هذه الحالة مسحه.لذلك يعمل هذا: -

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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top