मैं 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 मिला, जो इंटरफेस का उपयोग करने से बचने के लिए कम या ज्यादा कहता है। लेकिन मुझे यह जानकर खुशी होगी कि क्या कोई बेहतर विकल्प नहीं है।
कोई विचार?
धन्यवाद!
स्प्रिंग डेटा मोंगोडीबी का कौन सा संस्करण आप उपयोग कर रहे हैं? –
ठीक है, मैंने संस्करण जानकारी - org.mongodb.mongo-java-driver संस्करण 2.10.1, org.springframework.data.spring-data-mongodb संस्करण 1.2.1.RELEASE जोड़ा। –
आपके जैसे https://jira.springsource.org/browse/DATACMNS-311 पर ठोकर लग रहा है। क्या आपके पास क्लासपाथ पर स्प्रिंग डेटा कॉमन्स 1.5.1 है। यह संस्करण है कि बग को ठीक किया गया था। –