当前位置: 首页 > 知识库问答 >
问题:

Play framework 2.4(Java)mongo async db驱动程序3.0查询

仲和韵
2023-03-14

您好,我正在尝试为MongoDB异步驱动程序(3.0)编写异步代码http://mongo-java-driver/3.0/driver-async/with Play framework2.4(Java)in controller with async result https://www.playframework.com/documentation/2.3.x/javaasync,当我测试它时,承诺的结果是对MongoDB的异步调用之外的,所以有时我的响应中有空的json,请您能帮我一下吗?

public F.Promise<Result> list() {
    final List<Document> accounts = new ArrayList<Document>();
    F.Promise<List<Document>> promiseOfAccounts = F.Promise.promise(
        new F.Function0<List<Document>>() {
            public List<Document> apply() {
                accountRepository.getCollection().find().into(accounts,
                        new SingleResultCallback<List<Document>>() {
                            @Override
                            public void onResult(final List<Document> result, final Throwable t) {
                            }
                        });
                return accounts;
            }
        }
    );
    return promiseOfAccounts.map(
        new F.Function<List<Document>, Result>() {
            public Result apply(List<Document> i) {
                return ok(i);
            }
        }
    );
}

共有1个答案

史昱
2023-03-14

返回accounts时,SigleResultCallback闭包尚未执行。当在OK(i)表达式中序列化时,这将导致列表为空。要使其工作,您必须自己在singleResultCallback中解析承诺。记住Playpromission坐在scalafutures和scala promissions(这与Playf.promissions不同)上。你应该这样做:

Promise<List<Document>> accountsPromise = Promise$.MODULE$.apply();
ArrayList<Document> accounts = new ArrayList<Document>();
accountRepository.getCollection().find().into(accounts,
        new SingleResultCallback<List<Document>>() {
            @Override
            public void onResult(final List<Document> result, final Throwable t) {
                accountsPromise.success(result);
            }
        });
promiseOfAccounts=F.Promise.wrap(accountsPromise.future());
return promiseOfAccounts.map(
        new F.Function<List<Document>, Result>() {
            public Result apply(List<Document> i) {
                return ok(i);
            }
        }
);

当您调用scalapromisesuccess方法解决时,未来的值变得可用,但您在此之前返回playf.promise时,反应编程的卓越之处就显现出来了。

 类似资料:
  • 问题内容: 我目前正在尝试使用(相对)新的3.0 Java驱动程序连接到MongoDB副本集。但是,我似乎无法捕捉到用户提供错误凭据时发生的MongoSecurityExceptions。这是我当前的代码。 当使用正确的凭据运行时,此代码可以正常工作,但是如果提供了错误的凭据,则会在try-catch之外引发异常。 任何想法在哪里处理身份验证异常? 问题答案: MongoClient构造函数不会引

  • 我正在尝试使用MongoDBJava驱动程序作为聚合命令的一部分创建查询。目前我允许日期范围或特定日期数组作为参数。例如 日期范围查询工作正常,我解析xml并将其转换为在mongo中生成以下查询的DBObject; 对于指定日期,我只想返回在给定日期的00:00:00.000和第二天的00:00:00.000之间发生的结果。根据我对mongo查询的基本了解,我希望做一个类似于日期范围的$匹配,但是

  • 问题内容: 在早期版本的MongoDB Java驱动程序中,要运行查询并对结果进行无序批量增补,我们要做的就是: 但是在版本3中,随着Bson Document支持和MongoCollection.bulkWrite()方法的引入,该怎么做? 我尝试了这个: 但是,我需要upsert功能。 谢谢。 问题答案: 您仍然可以使用所有功能,只是BulkWrites现在具有不同的语法: 因此,您可以使用(

  • 通过使用MongoDB和Java驱动程序,我有一个用户集合,我想根据他们的ObjectId进行查询(总体情况:我从ObjectId推断出对象的创建时间戳)。 问题是,用ObjectId查询似乎不起作用:我总是没有结果。为了测试的目的,我在搜索查询中硬编码了数据库中现有用户的ObjectId,只是为了确保我能得到结果: {“_id”:ObjectId(“565ef85ee4b0a4db3c2fc96

  • 问题内容: 我们当前的连接配置如下所示: 并且已在当前版本(源代码)中弃用,并将被删除:“此方法无法替代。使用connectTimeout属性控制连接超时。” 我认为重试和连接超时是两回事。有谁知道为什么改变了它以及它有什么(内部)含义? 问题答案: 关于autoConnectRetry的含义有很多困惑。大多数人认为这意味着,如果操作由于IOException而失败,驱动程序将重试该操作,直到ma

  • 我是SeleniumWebDriver的新手。我写这段代码是为了理解导航命令,但是一旦浏览器打开,就会显示一个登录弹出窗口。我试图使用类名或xpath关闭它,但出现超时异常。 在这种情况下,我需要使用显式等待吗?你能帮我找出问题所在吗? } 例外情况: [43.366][SEVERE]:超时接收来自渲染器的消息: 37.150[43.373][SEVERE]:超时接收来自渲染器的消息:-0.007