sql >> Databáze >  >> NoSQL >> MongoDB

Načtení konkrétního klíče MongoDB z DuplicateKeyException, který byl skutečně duplikován (Java/Spring)

Ne tak docela, protože Mongo Java Driver již odhaluje poslední chybu jako vytvořený řetězec:

writeResult.getLastError().get("err") vrátí něco jako:

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

To platí také pro shell a každého řidiče, myslím.

Myslím, že rozumné řešení je analyzovat takovou výjimku duplicitního klíče pomocí vlastní výjimky:

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

... vlastní překladač výjimek:

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

... a správné nastavení konfigurace Spring:

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

UPRAVIT

Po kontrole MongoTemplate kód (1.4.1.RELEASE), zdá se, že interně SimpleMongoDbFactory se používá k načtení výchozího MongoExceptionTranslator , tedy ten vytvořený pomocí MongoFactoryBean je ve stínu. Tuhle část jsem vynechal.

Řešením je přepsat SimpleMongoDbFactory (zapomeňte na MongoFactoryBean , je v tomto kontextu k ničemu):

public class MySimpleMongoDbFactory extends SimpleMongoDbFactory {

    PersistenceExceptionTranslator translator = new       
            DetailedDuplicateKeyExceptionTransaltor();

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

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

Nyní můžete vytvořit šablonu pomocí vlastní MongoDbFactory :

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

Zkusil jsem to a tohle mi funguje.



  1. Jaká je maximální velikost hodnoty, kterou můžete uložit v redis?

  2. vnořená výjimka je redis.clients.jedis.exceptions.JedisConnectionException:Nelze získat zdroj z fondu

  3. Atomicita funkce findAndModify na vložených dokumentech

  4. vyberte 2 pole a vraťte seřazené pole s jejich odlišnými hodnotami