वास्तव में नहीं, क्योंकि मोंगो जावा ड्राइवर पहले से ही अंतिम त्रुटि को एक निर्मित स्ट्रिंग के रूप में उजागर करता है:
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"));
कोशिश की थी, और यह मेरे लिए काम करता है।