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.