MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Truy xuất khóa MongoDB cụ thể từ DuplicateKeyException thực sự đã được sao chép (Java / Spring)

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB tìm phạm vi ngày nếu trùng lặp với các ngày khác

  2. Mongo mở quá nhiều kết nối

  3. mongodb findOne với giải thích

  4. Sử dụng MongoEngine và PyMongo cùng nhau

  5. Mongorestore có thể lấy một đối số url duy nhất thay vì các đối số riêng biệt không?