سؤال

أواجه بعض المشاكل في استخدام Spring-data-mongodb 1.3.3.RELEASE وJava 1.6.

الإعداد الخاص بي معقد بعض الشيء لأنه يتعين علي التعامل مع البيانات القديمة، لذلك لدي إعداد مخصص TypeMapper (تمتد DefaultMongoTypeMapper) ومجموعتين مختلفتين من محولات القراءة/الكتابة.بالإضافة إلى ذلك أستخدم @TypeAlias لإعداد _class المعلومات في قاعدة البيانات.

تتكون النماذج الإشكالية من عدة قوائم متداخلة، يتم كتابة بعضها مثل

List<DocumentValue>

قد يحتوي MyObject على قائمة كائنات

List<Object>

والتي قد تحتوي على آخر DocumentValue هدف.

يبدو أن هذا الإعداد يعمل، ويتم تشغيل اختبارات الوحدة دون أي مشكلة، ويبدو تعيين الكائنات جيدًا في مصحح الأخطاء.طلبي هو تطبيق ويب وأنا قادر على الكتابة DocumentValueالصورة في مجموعة، و _class المعلومات موجودة.

طالما أنني لا أقوم بإيقاف تشغيل الخادم (قطط في حالتي)، فإن تعيين الكائنات يعمل.ولكن عندما أقوم بإعادة تشغيل الخادم (بدء تشغيل JVM جديد)، DocumentValue لم يتم تعيين الكائنات بشكل صحيح ولكن يتم التعامل معها على أنها java.util.Map.ال _class يبدو أن المعلومات يتم تجاهلها.أفترض أنه قد تكون هناك مشكلة في سياق التعيين الخاص بي (هل يجب تسجيل كيانات النموذج الخاصة بي أثناء بدء سياق الربيع؟)، لكنني غير قادر على العثور على التكوين الخاطئ.هل لدى أي شخص بعض المشاكل المماثلة أو لديه بعض الاقتراحات؟

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

المحلول

شكرا لردك.أعتقد أنني وجدت سبب تجاهل _class.أنت على حق، أستخدم مجموعة غير عادية من TypeMapper.

اسمحوا لي أن أعرض لكم CustomTypeMapper:

public class CustomTypeMapper extends DefaultMongoTypeMapper {

    public CustomTypeMapper (MongoMappingContext mappingContext) {

        super(DEFAULT_TYPE_KEY,
                Arrays.asList(new MappingContextTypeInformationMapper(
                        mappingContext)));
    }

    @Override
    public <T> TypeInformation<? extends T> readType(DBObject source,
            TypeInformation<T> basicType) {

        // do some custom recognition

                // or just to the common type mapping
        return super.readType(source, basicType);

    }
}

إلى جانب التعرف على النوع الشائع، هناك شيء خاص وهو المنشئ الذي يتم فيه استخدام MappingContextTypeInformationMapper لاستخدام التعليقات التوضيحيةTypeAlias.

المفتاح هنا هو MongoMappongContext المطلوب.في الحالة غير الوظيفية، قمت بتهيئة CustomTypeMapper مثل

<bean id="customTypeMapper" class="de.flexguse.repository.CustomTypeMapper">
    <constructor-arg name="mappingContext">
        <bean class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
    </constructor-arg>
</bean>

التي نجحت ولكنها كانت خاطئة، لأن المثيل الجديد لـ MongoMappingContext لم يحتوي على أي معلومات TypeInformation مقدمة عن طريق تعيين سمة الحزمة الأساسية في

<mongo:mapping-converter id="customMappingConverter" db-factory-ref="mongoDbFactory"
        type-mapper-ref="customTypeMapper" base-package="de.flexguse.model" >

    <mongo:custom-converters>
            ... some custom converters ...
    </mongo:custom-converters>

</mongo:mapping-converter>

لسوء الحظ، لم أتمكن من معرفة مكان إنشاء MongoMappingContext حتى أتمكن من استخدامه كوسيطة منشئة، لذلك اخترعت حبة بسيطة MongoMappingContextProvider التي تحصل على MongoMappingContext باستخدام @Autowire

public class MongoMappingContextProvider {

    @Autowired
    private MongoMappingContext mappingContext;

    /**
     * @return the mappingContext
     */
    public MongoMappingContext getMappingContext() {
        return mappingContext;
    }

}

يبدو التكوين الربيعي لـ CustomTypeMapper الآن على هذا النحو

<bean id="mongoMappingContextProvider" class="de.flexguse.repository.MongoMappingContextProvider" />

<bean id="customTypeMapper" class="de.flexguse.repository.CustomTypeMapper">
    <constructor-arg name="mappingContext" value="#{mongoMappingContextProvider.mappingContext}" />
</bean>

هذا الحل يعمل بالنسبة لي.

بالمناسبة، للتأكد من حصولي على جميع معلومات TypeInformations لجميع وحدات الفول النموذجية التي أستخدمها، أضفت @Document إلى كل وحدة نموذجية مستمرة - فقط في حالة؛)

ربما يكون هذا مفيدًا لشخص آخر يعاني من مشاكل مماثلة.

التحيات ، كريستوف

نصائح أخرى

أظن أن المشكلة تحدث بسبب مجموعة غير عادية من TypeMapper الاستخدام والمحولات. لو يتم تنفيذها يدويًا Converter يتم تسجيل مثيل لنوع معين، ذلك Converter مسؤول عن إنشاء كائن ثابت وقابل للقراءة بواسطة MongoDB ومنه.هذا يعني أن مثيل المحول الخاص بك يحتاج إلى كتابة معلومات النوع بنفسه.

إذا لم تتمكن من تشغيله ويمكنك تجميع نموذج صغير من المشروع لإعادة إنتاج المشكلة (يفضل أن يكون حالة اختبار للتنفيذ)، فلا تتردد في تقديم تذكرة في موقعنا جيرا مثال.

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