在Java中抑制运行时控制台警告的最佳方法是什么?

时间:2009-04-13 19:13:23

标签: java console runtime warnings suppress-warnings

我正在使用org.apache.commons.httpclient.methods.PostMethod类的getResponseBody()方法。但是,我总是在运行时收到一条写入控制台的消息:

警告:要缓冲大型或未知大小的缓冲响应体。建议使用getResponseBodyAsStream。

在代码中我必须将响应写入字节数组,所以它应该是我应该使用的getResponseBody()方法。但有一种简单的方法可以抑制警告信息,所以我不必每次都看它吗?

如果是编译器错误,我会使用 @SuppressWarnings 注释,但这不是编译时问题;它发生在运行时。此外,我可以使用getResponseBodyAsStream来写入ByteArrayOutputStream,但这似乎是一种解决警告的方法(额外的代码行来执行getResponseBody()已经为我做的事情。)

我的猜测是答案涉及System.out或System.err操作,但是有一个很好的方法吗?

7 个答案:

答案 0 :(得分:19)

如果要干净地停止此日志条目,则会有一个可调整的最大值来触发警告。我看到了looking at the code

        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设置为所需值的地方。

答案 1 :(得分:12)

当httpClient不知道返回数据的长度时,会发出警告 您应该在服务器端设置content-length属性

response.addHeader("Content-Type", "text/html; charset=utf-8");
response.addHeader("Content-Length", String.valueOf(output.getBytes("utf8").length));
之后,该警告应该消失

答案 2 :(得分: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我需要把它放在哪里   response是一个字节数组。如果   必要的,我们可以做一个重构   允许它采取的API   流;那会更好。该   警告绝对是一个   原因。

如果您可以修改API,请执行此操作。在这种情况下,流处理是最好的方法。如果由于内部压力或其他因素而不能,请转到@John M的路线并提升BUFFER_WARN_TRIGGER_LIMIT - 但请确保您拥有已知的contentLength,否则该路线将失败。

答案 3 :(得分:8)

库是通过log4j输出的吗?如果是这样,编辑log4j.properties以将此类的输出设置为“ERROR”将起作用,例如。

log4j.logger.org.apache.commons.httpclient.methods.PostMethod=ERROR

答案 4 :(得分:4)

This issue has already been debated on the ASF JIRA。有两种方法可以解决这个问题:

  • BUFFER_WARN_TRIGGER_LIMIT设置更高的值。足够高的值更有可能抑制警告;然而,这违背了警告本身的目的。如果要缓存大量数据以便最终在一次传递中解析,那么在处理数组之前最好将数据从流读取到数组中。
  • 如果您对ERROR或FATAL感到满意,请将HttpClient的日志记录级别设置为更高的值。

答案 5 :(得分:1)

假设警告写入stderr,您可以始终通过将stderr管道传输到/dev/null或系统中的等效项来禁止警告。

答案 6 :(得分: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);