sql >> Database teknologi >  >> NoSQL >> MongoDB

Hentning af den specifikke MongoDB-nøgle fra DuplicateKeyException, der faktisk blev duplikeret (Java/Spring)

Ikke rigtig, da Mongo Java-driveren allerede afslører den sidste fejl som en konstrueret streng:

writeResult.getLastError().get("err") returnerer noget såsom:

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

Dette gælder også for skallen og enhver driver, forestiller jeg mig.

En rimelig løsning, synes jeg, er at analysere en sådan duplikatnøgleundtagelse ved hjælp af en tilpasset undtagelse:

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

... en tilpasset undtagelsesoversætter:

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

... og indstille fjederkonfigurationen korrekt:

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

REDIGER

Efter at have inspiceret MongoTemplate kode (1.4.1.RELEASE), ser det ud til, at internt er en SimpleMongoDbFactory bruges til at hente en standard MongoExceptionTranslator , så den, der er oprettet med MongoFactoryBean er skygget. Havde misset den del.

Løsningen er at tilsidesætte SimpleMongoDbFactory (glem alt om MongoFactoryBean , det er ubrugeligt i denne sammenhæng):

public class MySimpleMongoDbFactory extends SimpleMongoDbFactory {

    PersistenceExceptionTranslator translator = new       
            DetailedDuplicateKeyExceptionTransaltor();

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

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

Nu kan du konstruere en skabelon ved hjælp af den tilpassede MongoDbFactory :

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

Havde prøvet, og denne virker for mig.



  1. Opsætning af ElastiCache Redis med Elastic BeanStalk + Django

  2. Sådan tilføjes ordre ved at bruge @query i mongodb repository

  3. java spring MappingJacksonJsonView gør ikke toString på mongodb ObjectId

  4. Hvordan serialiseres et kort i Java til lagring i Redis?