MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

विशिष्ट MongoDB कुंजी को DuplicateKeyException से पुनर्प्राप्त करना जो वास्तव में डुप्लिकेट किया गया था (जावा/स्प्रिंग)

वास्तव में नहीं, क्योंकि मोंगो जावा ड्राइवर पहले से ही अंतिम त्रुटि को एक निर्मित स्ट्रिंग के रूप में उजागर करता है:

writeResult.getLastError().get("err") कुछ इस तरह लौटाता है:

insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.person.$username dup key: { : "joe" }

यह शेल और हर ड्राइवर के लिए भी सच है, मेरी कल्पना है।

एक उचित समाधान, मुझे लगता है, एक कस्टम अपवाद का उपयोग करके ऐसे डुप्लिकेट कुंजी अपवाद को पार्स करना है:

public class DetailedDuplicateKeyException extends DuplicateKeyException {
    public DetailedDuplicateKeyException(String msg) {
        // Instead of just calling super parse the message here.
        super(msg);
    }
}

... एक कस्टम अपवाद अनुवादक:

public class DetailedDuplicateKeyExceptionTransaltor extends MongoExceptionTranslator {

    @Override
    public DataAccessException translateExceptionIfPossible(RuntimeException ex) {
        if (ex instanceof MongoException.DuplicateKey) {
            return new DetailedDuplicateKeyException(ex.getMessage());
        }
        return super.translateExceptionIfPossible(ex);
    }
}

... और स्प्रिंग कॉन्फ़िगरेशन को ठीक से सेट करना:

@Bean
public MongoFactoryBean mongo() {
    MongoFactoryBean mongo = new MongoFactoryBean();
    mongo.setExceptionTranslator(new DetailedDuplicateKeyExceptionTransaltor());
    mongo.setHost("localhost");
    return mongo;
}

संपादित करें

MongoTemplate . का निरीक्षण करने के बाद कोड (1.4.1.रिलीज), ऐसा लगता है कि आंतरिक रूप से एक SimpleMongoDbFactory डिफ़ॉल्ट MongoExceptionTranslator . को पुनः प्राप्त करने के लिए उपयोग किया जाता है , इसलिए MongoFactoryBean . के साथ बनाया गया छाया हुआ है। वह हिस्सा छूट गया था।

समाधान SimpleMongoDbFactory . को ओवरराइड करना है (MongoFactoryBean के बारे में भूल जाओ) , इस संदर्भ में यह बेकार है):

public class MySimpleMongoDbFactory extends SimpleMongoDbFactory {

    PersistenceExceptionTranslator translator = new       
            DetailedDuplicateKeyExceptionTransaltor();

    public MySimpleMongoDbFactory(Mongo mongo, String databaseName) {
        super(mongo, databaseName);
    }

    @Override
    public PersistenceExceptionTranslator getExceptionTranslator() {
        return translator;
    }
}

अब आप कस्टम MongoDbFactory . का उपयोग करके टेम्पलेट का निर्माण कर सकते हैं :

template = new MongoTemplate (new MySimpleMongoDbFactory(new MongoClient(), "test"));

कोशिश की थी, और यह मेरे लिए काम करता है।



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Nodejs में विशिष्ट Mongodb का उपयोग नहीं कर सकता

  2. मोंगोडब में $ रेगेक्स का उपयोग कैसे करें?

  3. मैं $unwind . के साथ दस्तावेज़ों को एकत्रीकरण में कैसे रखूँ?

  4. नेवला और फिक्सी (हेरोकू ऐड-ऑन) का उपयोग करके मोंगोडब से कनेक्ट करना

  5. MongoDB अलग मूल्य की गणना करता है?