मैं अपने प्रश्न का उत्तर स्वयं दूंगा। जैसा कि टिप्पणियों में बताया गया है, समाधान Converter
. का उपयोग करना है ।
यहां एक उदाहरण दिया गया है कि मैं अपने वर्ग मॉडल के साथ क्या हासिल करना चाहता हूं:
एक Contact
या तो एक Person
हो सकता है या एक Organisation
.
अगर आप स्प्रिंग-डेटा-मोंगोडब का उपयोग कर रहे हैं MongoRepository
अपने इकाई मॉडल के अनुसार अपने डेटाबेस में डेटा लिखने के लिए, एक _class
फ़ील्ड को दस्तावेज़ के मूल और जटिल प्रॉपर्टी प्रकारों में जोड़ा जाएगा (यह अनुभाग देखें
) यह फ़ील्ड जावा वर्ग के पूर्ण रूप से योग्य नाम को संग्रहीत करता है और यह MongoDb दस्तावेज़ से स्प्रिंग डेटा मॉडल में मैपिंग करते समय अस्पष्टता की अनुमति देता है।
यदि आपका ऐप सिर्फ डेटाबेस से दस्तावेज़ पढ़ता है (कोई _class
. नहीं फ़ील्ड), आपको स्प्रिंग डेटा को यह बताना होगा कि Contact
mapping को मैप करते समय किस वर्ग को इंस्टेंट करना है . स्प्रिंग-डेटा आपको Converter
. का उपयोग करके डिफ़ॉल्ट प्रकार के मानचित्रण व्यवहार को अनुकूलित करने की अनुमति देता है . स्पष्ट Converter
का उपयोग करना डिफ़ॉल्ट ओवरराइड करें कक्षा के लिए मानचित्रण
. आपको अपनी पूरी कक्षा को स्पष्ट रूप से मानचित्रित करने की आवश्यकता है। मेरे ContactReadConverter . का एक उदाहरण यहां दिया गया है :
@ReadingConverter
public class ContactReadConverter implements Converter<Document, Contact> {
@Override
public Contact convert(Document source) {
if (source.get("firstName") == null) {
Organisation organisation = new Organisation();
I18n name = new I18n();
name.setEn(source.get("name", Document.class).get("en", String.class));
name.setFr(source.get("name", Document.class).get("fr", String.class));
organisation.setName(name);
organisation.setAcronym(source.get("acronym", String.class));
organisation.setRole(source.get("role", String.class));
return organisation;
}
Person person = new Person();
person.setFirstName(source.get("firstName", String.class));
person.setLastName(source.get("lastName", String.class));
person.setRole(source.get("role", String.class));
person.setEmail(source.get("email", String.class));
person.setOrcId(source.get("orcId", String.class));
if (source.get("organisation") != null) {
Document sourceOrg = source.get("organisation", Document.class);
Organisation organisation = new Organisation();
organisation.setAcronym(sourceOrg.get("acronym", String.class));
organisation.setRole(sourceOrg.get("role", String.class));
if (sourceOrg.get("name") != null) {
I18n name = new I18n();
name.setFr(sourceOrg.get("name", Document.class).get("fr", String.class));
name.setEn(sourceOrg.get("name", Document.class).get("en", String.class));
organisation.setName(name);
}
person.setOrganisation(organisation);
}
return person;
}
}
फिर, नए परिभाषित कन्वर्टर्स को पंजीकृत करने की आवश्यकता है:
@Configuration
public class DataportalApplicationConfig extends AbstractMongoConfiguration {
@Value("${spring.data.mongodb.uri}")
private String uri;
@Value("${spring.data.mongodb.database}")
private String database;
@Override
public MongoClient mongoClient() {
return new MongoClient(new MongoClientURI(uri));
}
@Override
protected String getDatabaseName() {
return database;
}
@Bean
@Override
public MongoCustomConversions customConversions() {
List<Converter<?, ?>> converterList = new ArrayList<>();
converterList.add(new ContactReadConverter());
return new MongoCustomConversions(converterList);
}
}
आशा है कि यह मदद करता है।