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

sea*_*and 17 java console warnings runtime suppress-warnings

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

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

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

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

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

Joh*_*n M 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.");
        }
Run Code Online (Sandbox Code Playgroud)

HttpMethodBase.setParams()看起来像是将HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT设置为所需值的位置.


viv*_*dea 12

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

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

在那之后,那个警告应该消失

  • 为'解决根本问题而不是忽视它'+1. (2认同)

Ran*_*pho 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);
Run Code Online (Sandbox Code Playgroud)

编辑:

我同意最好使用流,但就像现在一样,我需要放置响应的目标API是一个字节数组.如有必要,我们可以对API进行重构,以便它可以获取流; 那会更好.警告肯定是有原因的.

如果您可以修改API,请执行此操作.在这种情况下,流处理是最好的方法.如果你不能因为内部压力或其他原因,去@John M的路线并抽出BUFFER_WARN_TRIGGER_LIMIT- 但要确保你有一个已知的contentLength,或者甚至那条路线都会失败.


Ste*_* B. 8

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

log4j.logger.org.apache.commons.httpclient.methods.PostMethod=ERROR
Run Code Online (Sandbox Code Playgroud)