2

Java High Level REST Client を介してMulti-Get リクエストを発行すると、次の例外が発生します。

「Response{requestLine=POST /_mget HTTP/1.1, host= http://localhost:9200 , response=HTTP/1.1 200 OK} のレスポンス本文を解析できません」

Elastic に送信されたログから次の JSON を取得しました。

{
    "docs": [
        {
            "_index": "blah",
            "_type": null,
            "_id": "some-id-232332",
            "routing": null,
            "stored_fields": null,
            "version": -3,
            "version_type": "internal",
            "_source": {
                "includes": [],
                "excludes": []
            }
        }
    ]
}

上記の JSON を Postman 経由で Elastic に送信したところ、次の応答が表示されました (ログに表示されるものと同じです)。

{
    "docs": [
        {
            "_index": "blah",
            "_type": null,
            "_id": "some-id-232332",
            "found": false
        }
    ]
}

それは有効な応答ではありませんか?これはelasticsearch-rest-high-level-clientの問題ですか?

エラスティック 7.5.0、org.elasticsearch.client:elasticsearch-rest-high-level-client:7.5.2

4

1 に答える 1

4

getCause()実際の問題については、例外のを確認する必要がありました。null私がジャクソンに渡していmapper.readValue(nullBytes, Customer.class);たのは本当の問題でした。

興味深いことに、NPE は自分自身を示します‍♂️</a>。

スタック トレース: java.util.concurrent.ExecutionException: java.io.IOException: Unable to parse response body for Response{requestLine=POST /_mget HTTP/1.1, host= http://localhost:9200 , response=HTTP/1.1 200 OK}
...
...
本当の問題はここにあります!!!
原因: java.lang.IllegalArgumentException: com.fasterxml.jackson.databind.ObjectMapper._assertNotNull(ObjectMapper.java:4429) で引数「src」が null です

restHighLevelClient.mgetAsync(multiGetRequest, RequestOptions.DEFAULT, new ActionListener<MultiGetResponse>() {
    @Override
    public void onResponse(MultiGetResponse response) {
      for (var responseItem : response.getResponses()) {
        try {
          // simulating a null source
          byte[] nullBytes = null;
          customer = mapper.readValue(nullBytes, Customer.class);
        } catch (IOException e) {
          result.completeExceptionally(e);
        }
      }
      result.complete(true);
    }

    @Override
    public void onFailure(Exception ex) {
      //the real problem!!!
      //log.error("ex.cause", ex.getCause());
      log.error("error with mget", ex);
      result.completeExceptionally(ex);
    }
  });

再現の完全なソース完全なログ ファイル

于 2020-03-06T15:21:05.530 に答える