سؤال

لديّ كائن مجال أريد تخزينه لبعض الأشياء الموجودة فقط في وقت التشغيل. نظرت إلى توثيق ووجدت transients الكلمة الرئيسية ، والتي ، في وجهها كانت ما كنت أبحث عنه. هذا هو شكل كائن المجال الخاص بي ...

class Contact {

    def Seeker

    def beforeInsert() 
    {
       initiatedDate = new Date()
    }

    Date initiatedDate
    Date acceptedDate

    static transients = ['pal']
    Seeker pal
}

أين Seeker هي فئة رائعة ليست كائن مجال ، ولكنها عنصر نائب لبعض الخصائص.

حتى الآن كل شيء على ما يرام وجدول الاتصال الخاص بي ليس لديه ملف pal الحقل كما هو متوقع. في ContactController أتعلم للحصول على مجموعة من الاتصالات ، c, ثم ابحث عنهم Seeker الزملاء (تفاصيل كيفية حجبها) وتعيين pal حقل إلى كائن جديد.

c.pal = new Seeker();
c.pal.name = otherObject.name
render c as JSON

يبدو أن كل هذا يعمل بشكل جيد إلا أن الكائن PAL مفقود من JSON الذي تم إرجاعه.

هل هذا استخدام صحيح للعبور؟ تذكر المستندات أنها مفيدة للالتقاط المستندة إلى الوظائف والمستقبين ، لكن في حالتي أريد كائنًا فعليًا. هل يجب أن أكتب طريقة getPal () و setpal () على كائني؟

شكرًا

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

المحلول

تستخدم العابرة بالفعل لإيقاف الحقول في كائنات المجال من الاستمرار. (إذا كنت ترغب في تنفيذ بعض init على حقل PAL دون الحاجة إلى وضعه في وحدة التحكم الخاصة بك ، فيمكنك استخدام حدث ONLOAD () أو كتابة طريقة getPal () التي من شأنها أن تتجاوز getter الخاصية الافتراضية). أنت محق أيضًا في ملاحظة أن JSON Marshaller الافتراضي لا يعرض سوى الحقول المستمرة.

عند تقديم كائنات النطاق الخاصة بي ، وجدت أنه من المفيد إنشاء Marshallers كائن JSON بحيث لا يتم تقديم الخصائص غير المرغوب فيها ، ولكنها ستحل أيضًا مشكلتك العابرة أيضًا. يمكنك القيام بذلك باستخدام طريقة json.registerObjectMarshaller:

import grails.converters.JSON
...
class BootStrap {

    def init = {servletContext ->
        JSON.registerObjectMarshaller(Contact ) {
            def returnArray = [:]
            returnArray['id'] = it.id
            returnArray['initiatedDate'] = it.initiatedDate
            returnArray['acceptedDate'] = it.acceptedDate
            returnArray['pal'] = it.pal
            return returnArray
        }

        JSON.registerObjectMarshaller(Seeker) {
            ...
        }

إذا قمت بإضافة Marshallers في bootstrap.groovy ، فستكون متاحة في وحدات التحكم الخاصة بك.

HTH

(وجدت هذا أيضا: http://old.nabble.com/taggable-plugin-and-json-converter-ts24830987.html#a24832970)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top