MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Mengambil kunci MongoDB spesifik dari DuplicateKeyException yang sebenarnya diduplikasi (Java/Spring)

Tidak juga, karena Driver Mongo Java sudah memperlihatkan kesalahan terakhir sebagai String yang dibuat:

writeResult.getLastError().get("err") mengembalikan sesuatu seperti:

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

Ini juga berlaku untuk shell dan setiap driver, saya kira.

Solusi yang masuk akal, menurut saya, adalah mengurai pengecualian kunci duplikat tersebut menggunakan pengecualian khusus:

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

... penerjemah pengecualian khusus:

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);
    }
}

... dan mengatur konfigurasi Spring dengan benar:

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

EDIT

Setelah memeriksa MongoTemplate kode (1.4.1.RELEASE), tampaknya secara internal SimpleMongoDbFactory digunakan untuk mengambil MongoExceptionTranslator default , jadi yang dibuat dengan MongoFactoryBean dibayangi. Telah melewatkan bagian itu.

Solusinya adalah mengganti SimpleMongoDbFactory (lupakan MongoFactoryBean , tidak ada gunanya dalam konteks ini):

public class MySimpleMongoDbFactory extends SimpleMongoDbFactory {

    PersistenceExceptionTranslator translator = new       
            DetailedDuplicateKeyExceptionTransaltor();

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

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

Sekarang Anda dapat membuat template menggunakan MongoDbFactory khusus :

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

Telah mencoba, dan yang ini berhasil untuk saya.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Membuat pengguna pertama di MongoDB 3.2.

  2. Agregasi MongoDB:tambahkan bidang dari dokumen yang disematkan melalui jalur bidang dinamis

  3. Mongodb mengembalikan koleksi lama

  4. Jumlah pengembalian agregat MongoDB 0 jika tidak ada dokumen

  5. Dorong nilai ke Array jika kunci tidak ada Mongoose