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)
在那之后,那个警告应该消失
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,或者甚至那条路线都会失败.
库是通过log4j输出的吗?如果是这样,编辑log4j.properties以将此类的输出设置为"ERROR"将起作用,例如
log4j.logger.org.apache.commons.httpclient.methods.PostMethod=ERROR
Run Code Online (Sandbox Code Playgroud)