1

Scala 期货的新手我尝试调用一个网络服务,比如

wsClient.url(baseUrl + url).withHeaders("Content-Type" -> "application/json").post(dataForR).flatMap(parseOutlierResponse)

使用ply-ws

我验证并映射响应如下https://gist.github.com/geoHeil/943a18d43279762ad4cdfe9aa2e40770

主要的是:

Await.result(callAMethodCallingTheFirstSnippet, 5.minutes)

奇怪的是,这在 repl 中工作得很好。但是,如果通过运行sbt run我会得到一个 NullPointer 异常。我已经手动验证了 JSON 响应。它像微风一样验证。甚至映射效果也很好。但是,我使用的期货肯定有问题。但我不确定出了什么问题。似乎在已经有结果之前调用了 flatMap 方法。

有趣的是,如果我不等待结果,则没有空指针异常,但解析的结果会正确显示(但是,程序不会退出)。但是在我真正使用此代码的地方,我不知何故需要等待成功完成以进一步处理它。

您将在下面找到问题的说明

响应正文如何为空?

4

2 回答 2

0

我认为您的代码没有任何重大问题!我用以下代码位做了一个小测试,它似乎在 REPL 和使用 sbt 运行时都运行良好:

    WS.clientUrl(s"http://$hostName/api/put").withHeaders(jsonHeaders: _*).post(body).map { r =>
      if (r.status >= 400)
        logger.warn(s"Invalid http response status: ${r.status} \n ${r.body}")
      else
        logger.debug(s"Successfully persisted data. Http response ${r.status}")
    }
于 2016-05-22T05:58:45.820 回答
0

经过越来越多的调试,我发现一些隐式在错误的范围内,并且依赖案例类的顺序是错误的。在将它们移动到正确的范围(执行请求的方法)之后,空指针异常被修复。

我只能在更改之后发现“真正的”错误flatmapmap我觉得这很奇怪。但是,现在这两种方法都可以正常工作。

于 2016-05-23T06:11:19.103 回答