Không thực sự như vậy, vì Trình điều khiển Java Mongo đã để lộ lỗi cuối cùng dưới dạng một Chuỗi được xây dựng:
writeResult.getLastError().get("err")
trả về một cái gì đó chẳng hạn như:
insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.person.$username dup key: { : "joe" }
Điều này cũng đúng với shell và mọi trình điều khiển, tôi tưởng tượng.
Tôi nghĩ, một giải pháp hợp lý là phân tích cú pháp ngoại lệ khóa trùng lặp như vậy bằng cách sử dụng một ngoại lệ tùy chỉnh:
public class DetailedDuplicateKeyException extends DuplicateKeyException {
public DetailedDuplicateKeyException(String msg) {
// Instead of just calling super parse the message here.
super(msg);
}
}
... một trình dịch ngoại lệ tùy chỉnh:
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);
}
}
... và đặt cấu hình Spring đúng cách:
@Bean
public MongoFactoryBean mongo() {
MongoFactoryBean mongo = new MongoFactoryBean();
mongo.setExceptionTranslator(new DetailedDuplicateKeyExceptionTransaltor());
mongo.setHost("localhost");
return mongo;
}
CHỈNH SỬA
Sau khi kiểm tra MongoTemplate
mã (1.4.1.RELEASE), có vẻ như bên trong một SimpleMongoDbFactory
được sử dụng để truy xuất MongoExceptionTranslator
mặc định , vì vậy cái được tạo bằng MongoFactoryBean
bị bóng. Đã bỏ lỡ phần đó.
Giải pháp là ghi đè SimpleMongoDbFactory
(quên MongoFactoryBean
, nó vô dụng trong bối cảnh này):
public class MySimpleMongoDbFactory extends SimpleMongoDbFactory {
PersistenceExceptionTranslator translator = new
DetailedDuplicateKeyExceptionTransaltor();
public MySimpleMongoDbFactory(Mongo mongo, String databaseName) {
super(mongo, databaseName);
}
@Override
public PersistenceExceptionTranslator getExceptionTranslator() {
return translator;
}
}
Bây giờ bạn có thể tạo một mẫu bằng cách sử dụng MongoDbFactory
tùy chỉnh :
template = new MongoTemplate
(new MySimpleMongoDbFactory(new MongoClient(), "test"));
Đã thử và cái này phù hợp với tôi.