不推荐使用Spring MongoClient getDB(),在不抑制警告的情况下解决此问题的任何方法?

时间:2018-12-19 09:09:55

标签: java mongodb generics spring-data-mongodb

我有一个对mongo数据库执行批量写入操作的方法,它可以按预期工作。

问题是,由于较新的版本支持mongoClient.getDB(),我收到了mongoClient.getDatabase()引起的弃用警告。

使用DB,我可以得到初始化无序批量操作等所需的DBCollection。使用mongoClient.getDatabase(),将返回MongoCollection,这不是我所需要的。

有没有一种方法可以解决此过时警告而不抑制它?我的意思是,如果有一种使用getDatabase()的方式,然后将MongoCollection转换为DBCollection,但是我的批量操作是否仍然有效?

或者,如果有人可以使用bulkSaveOrUpdate()而不是MongoCollection给出DBCollection的转换代码,那就太好了。

下面是bulkSaveOrUpdate()方法的代码。

方法:

@SuppressWarnings("deprecation")
private <T> void bulkSaveOrUpdate(List<? extends BaseModel> items) {
    String databaseName = m_mongoTemplate.getDb().getName();
    String collectionName = m_mongoTemplate.getCollectionName(items.get(0).getClass());
    DB db = m_mongoClient.getDB(databaseName);
    DBCollection collection = db.getCollection(collectionName);
    BulkWriteOperation bulkOps = collection.initializeUnorderedBulkOperation();
    MongoConverter converter = m_mongoTemplate.getConverter();
    try{
        BasicDBObject dbObject;
        for (BaseModel item : items) {
            if(item.getId() == null){
                item.setId(new ObjectId() + "");
                dbObject = new BasicDBObject();
                converter.write(item, dbObject);
                bulkOps.insert(dbObject);
            } else {
                dbObject = new BasicDBObject();
                converter.write(item, dbObject);
                BasicDBObject query = new BasicDBObject();
                query.put("_id", dbObject.get("_id"));
                BulkWriteRequestBuilder writeRequest = bulkOps.find(query);
                BulkUpdateRequestBuilder updateReq = writeRequest.upsert();
                updateReq.replaceOne(dbObject);
            }

        }
        bulkOps.execute();
    } catch (Exception e) {
        _LOG.error("Bulk upsert failed :: ", e.getMessage());
    }
}

2 个答案:

答案 0 :(得分:0)

您应该使用T扩展客户而不是T

答案 1 :(得分:0)

为了通知编译器您打算使用从超类(即您的客户类)继承特定字段和方法的对象来填充集合,您可以使用:

Collection<T extends Customer> items

这告诉编译器,无论您将什么对象放入集合中,它始终具有Customer类中包含的字段和方法。

希望这可以提供更多的清晰度!