2013-07-28 13 views
12

मैं MongoDB के लिए वसंत-डाटा उपयोग कर रहा हूँ है:स्प्रिंग डाटा MongoDB मुद्दा जो एक अंतरफलक

संस्करण जानकारी - org.mongodb.mongo-जावा-ड्राइवर को संस्करण 2.10.1, org.springframework। data.spring-data-mongodb संस्करण 1.2.1.RELEASE।

मैं सिर्फ वसंत-डेटा-MongoDB और साथ जावा में कुछ एप्लिकेशन का विकास करना शुरू:

मैं एक मामले here में परिभाषित किया गया है, जो है (स्वरूपण के लिए खेद है ...) के समान है कि है

मैं इस तरह दस्तावेज़ सेम की एक जोड़ी है:

@Document(collection="myBeanBar") 
public class BarImpl implements Bar { 
    String id; 
    Foo foo; 
    // More fields and methods ... 
} 

@Document 
public class FooImpl implements Foo { 
    String id; 
    String someField; 
    // some more fields and methods ... 
} 
कुछ मुद्दा यह है कि मैं हल करने में सक्षम नहीं किया गया में आए

और मैं एक विधि के साथ भंडार वर्ग कि बस का आह्वान एक इस के समान लगता है है:

public List<? extends Bar> findByFooField(final String fieldValue) { 
    Query query = Query.query(Criteria.where("foo.someField").is(fieldValue)); 
    return getMongoOperations().find(query, BarImpl.class); 
} 

एक बार सहेजा जा रहा है काम करता है ठीक है, यह इसके मोंगो में के साथ की बचत होगी फू और बार दोनों के लिए "_class" विशेषता। हालांकि, फू में कुछ विशेषता के आधार पर लग रहा है इस तरह एक अपवाद फेंक होगा:

Exception in thread "main" java.lang.IllegalArgumentException: No 
property someField found on test.Foo! 
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentPropertyPath(AbstractMappingContext.java:225) 
    at org.springframework.data.mongodb.core.convert.QueryMapper.getPath(QueryMapper.java:202) 
    at org.springframework.data.mongodb.core.convert.QueryMapper.getTargetProperty(QueryMapper.java:190) 
    at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:86) 
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1336) 
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1322) 
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:495) 
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:486) 

समाधान है कि दिया गया था सार वर्ग है, जो ढांचे को बताया एक विशिष्ट का उपयोग करने पर @TypeAlias ​​एनोटेशन का उपयोग किया गया कार्यान्वयन (इस मामले में FooImpl)।

@Document(collection="myBeanBar") 
public class BarImpl implements Bar { 
    String id; 
    IFoo foo; 
    // More fields and methods ... 
} 

मैं बहुत इंटरफ़ेस IFoo पर टिप्पणी के डाल करने के लिए अनिच्छुक हूँ एक डिफ़ॉल्ट कार्यान्वयन दे देंगे कि:

मेरे मामले में, मैं इंटरफ़ेस सदस्यों, बजाय सार सदस्य , इसके बजाय मैं ढांचे को बताना चाहता हूं कि यह फ़ील्ड का लागू करने के संदर्भ में बारआईएमपी वर्ग के संदर्भ में डिफ़ॉल्ट कार्यान्वयन, @JsonTypeInfo के समान है:

@Document(collection="myBeanBar") 
public class BarImpl implements Bar { 
    String id;  

    @JsonTypeInfo(use = Id.CLASS, defaultImpl = FooImpl.class) 
    IFoo foo; 

    // More fields and methods ... 
} 

मुझे this answer मिला, जो इंटरफेस का उपयोग करने से बचने के लिए कम या ज्यादा कहता है। लेकिन मुझे यह जानकर खुशी होगी कि क्या कोई बेहतर विकल्प नहीं है।

कोई विचार?

धन्यवाद!

+0

स्प्रिंग डेटा मोंगोडीबी का कौन सा संस्करण आप उपयोग कर रहे हैं? –

+0

ठीक है, मैंने संस्करण जानकारी - org.mongodb.mongo-java-driver संस्करण 2.10.1, org.springframework.data.spring-data-mongodb संस्करण 1.2.1.RELEASE जोड़ा। –

+2

आपके जैसे https://jira.springsource.org/browse/DATACMNS-311 पर ठोकर लग रहा है। क्या आपके पास क्लासपाथ पर स्प्रिंग डेटा कॉमन्स 1.5.1 है। यह संस्करण है कि बग को ठीक किया गया था। –

उत्तर

0

डेटा ऑब्जेक्ट में फ़ील्ड के रूप में अंतरफलक को परिभाषित करना वास्तव में बुरा विचार है।

इंटरफ़ेस का मतलब कुछ वस्तु करने की संभावना है, लेकिन फ़ील्ड के बारे में कोई जानकारी प्रदान न करें। क्या आपको वास्तव में इंटरफेस का उपयोग करने की ज़रूरत है? क्या आप इससे बच सकते हैं? यहां तक ​​कि अमूर्त वर्ग परिभाषा का उपयोग करना बेहतर विचार होगा।

पीएस बेशक, मेरे उत्तर को किसी भी मामले में सही उत्तर के रूप में चिह्नित नहीं किया जा सकता है।

5

मेरे समस्या प्रश्न के समान है, लेकिन अपवाद उत्पन्न थोड़ा अलग है:

Could not instantiate bean class [class name]: Specified class is an interface 

यह तब होता है जब मेरे डीबी वर्ग के क्षेत्रों में से एक एक अंतरफलक के रूप में घोषित किया गया है। इस क्षेत्र को सहेजना ठीक है लेकिन मोंगोडीबी से इसे पढ़ने पर अपवाद फेंक दिया गया है। अंततः मुझे समाधान मिला जो org.springframework.core.convert.converter.Converter का उपयोग करता है।

TWO करने के लिए कदम, 1. Converter लागू करने वाली कक्षा का निर्माण; 2. सर्वलेट संदर्भ में कनवर्टर पंजीकृत करें। और हां, आपको किसी मौजूदा कोड को संशोधित करने की आवश्यकता नहीं है, जैसे एनोटेशन जोड़ना।

@Document(collection="record") 
public class Record { 
    @Id 
    private String id; 

    // Data is an interface 
    private Data data; 

    // And some other fields and setter/getter methods of them 
} 

कनवर्टर:

@ReadingConverter 
public class DataReadConverter implements Converter<DBObject, Data> { 
    @Override 
    public Data convert(DBObject source) { 
     // Your implementation to parse the DBObject, 
     // this object can be BasicDBObject or BasicDBList, 
     // and return an object instance that implements Data. 

     return null; 
    } 
} 

करने के लिए आखिरी बात कनवर्टर रजिस्टर करने के लिए है, मेरी विन्यास में है

नीचे अपने मॉडल वर्ग है, जहां क्षेत्र Data एक अंतरफलक है एक्सएमएल:

<mongo:mongo id="mongo" /> 

<mongo:db-factory mongo-ref="mongo" dbname="example" /> 

<mongo:mapping-converter> 
    <mongo:custom-converters> 
     <mongo:converter> 
      <beans:bean class="com.example.DataReadConverter" /> 
     </mongo:converter> 
    </mongo:custom-converters> 
</mongo:mapping-converter> 

<beans:bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 
    <beans:constructor-arg name="mongoDbFactory" ref="mongoDbFactory" /> 
    <beans:constructor-arg name="mongoConverter" ref="mappingConverter" /> 
</beans:bean> 

एप्लिकेशन को तैनात करें और पुनः प्रयास करें। यह इंटरफ़ेस फ़ील्ड पर MongoDB से DBObject को सही तरीके से पार्स करना चाहिए।

मेरे वसंत MongoDB अनुप्रयोग का संस्करण है: वसंत - * - 4.1.0 और वसंत-डेटा-mongodb-1.6.0।

संबंधित मुद्दे