17

org.apache.commons.httpclient.methods.PostMethod クラスの getResponseBody() メソッドを使用しています。ただし、実行時に常にコンソールにメッセージが書き込まれます。

警告: サイズが大きいか不明な応答本文をバッファーに入れようとしています。代わりに getResponseBodyAsStream を使用することをお勧めします。

コードでは、とにかく応答をバイト配列に書き込む必要があるため、使用する必要があるのは getResponseBody() メソッドです。しかし、実行のたびに警告メッセージを見る必要がないように、警告メッセージを抑制する簡単な方法はありますか?

コンパイラ エラーの場合は@SuppressWarningsアノテーションを使用しますが、これはコンパイル時の問題ではありません。実行時に発生します。また、getResponseBodyAsStream を使用して ByteArrayOutputStream に書き込むこともできますが、これは警告を回避するハックな方法のように思えます (getResponseBody() が既に行っていることを行うための余分なコード行)。

私の推測では、答えには System.out または System.err 操作が含まれますが、これを行う良い方法はありますか?

4

7 に答える 7

19

このログ エントリを完全に停止したい場合は、警告をトリガーする調整可能な最大値があります。私はこれをコードで見ました

        int limit = getParams().getIntParameter(HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT, 1024*1024);
        if ((contentLength == -1) || (contentLength > limit)) {
            LOG.warn("Going to buffer response body of large or unknown size. "
                    +"Using getResponseBodyAsStream instead is recommended.");
        }

HttpMethodBase.setParams() は、HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT を目的の値に設定する場所のようです。

于 2009-04-13T19:23:56.940 に答える
12

その警告は、httpClient が返されるデータの長さがわからない場合に発生します。サーバー側で content-length 属性を設定する必要があります。

response.addHeader("Content-Type", "text/html; charset=utf-8");
response.addHeader("Content-Length", String.valueOf(output.getBytes("utf8").length));

その後、その警告は消えるはずです

于 2011-07-22T05:30:28.167 に答える
11

警告が示すように、バイト配列ではなくストリームを使用することをお勧めします。プッシュしようとしている応答が特に大きい場合 (大きなファイルであると仮定します)、すべてをメモリにロードすることになりますが、これは非常に悪いことです。

ストリームを使用する方が本当に良いです。

とはいえ、System.err または System.out を一時的に置き換えることでハッキングすることができます。これらは単なるPrintStreamオブジェクトであり、setOut および setErr メソッドで設定できます。

PrintStream oldErr = System.err;
PrintStream newErr = new PrintStream(new ByteArrayOutputStream());
System.setErr(newErr);

// do your work

System.setErr(oldErr);

編集:

ストリームを使用する方が望ましいことに同意しますが、現状では、応答を配置する必要があるターゲット API はバイト配列です。必要に応じて、ストリームを取得できるように API にリファクタリングを行うことができます。そのほうがいい。警告には必ず理由があります。

API を変更できる場合は、変更してください。この場合、ストリーム処理が最適な方法です。内圧などが原因でできない場合は、@ John Mのルートに移動してポンプアップBUFFER_WARN_TRIGGER_LIMITしますが、既知の contentLength があることを確認してください。そうしないと、そのルートでさえ失敗します。

于 2009-04-13T19:31:41.537 に答える
8

ライブラリはlog4jを介して出力していますか? その場合、log4j.properties を編集して、このクラスの出力を「ERROR」に設定すると機能します。

log4j.logger.org.apache.commons.httpclient.methods.PostMethod=ERROR
于 2009-04-13T19:21:25.057 に答える
4

この問題は、ASF JIRA ですでに議論されています。これを解決するには、次の 2 つの方法があります。

  • BUFFER_WARN_TRIGGER_LIMITに高い値を設定します。値が十分に大きいほど、警告が抑制される可能性が高くなります。ただし、それは警告自体の目的を無効にします。最終的に 1 回のパスで解析するために大量のデータをバッファリングしている場合は、配列で作業する前にストリームから配列にデータを読み取ったほうがよいでしょう。
  • ERROR または FATAL に慣れている場合は、HttpClient のログ レベルをより高い値に設定します。
于 2009-04-13T22:51:22.167 に答える
1

警告が stderr に書き込まれると仮定すると、stderr を にパイプする/dev/nullか、システム上の同等のものにパイプすることで、常に警告を抑制することができます。

于 2009-04-13T19:16:00.313 に答える
1

stderrメッセージを単純に「保存」し、メインタスクの完了後にそれらを出力する

PrintStream origErr = System.err;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream newErr = new PrintStream(baos);
System.setErr(newErr);

====== do stuff ======

System.setErr(origErr);
System.err.print(baos);
于 2011-07-03T20:09:36.757 に答える