【问题标题】:What's the best way to suppress a runtime console warning in Java?在 Java 中抑制运行时控制台警告的最佳方法是什么?
【发布时间】:2010-10-19 04:53:40
【问题描述】:

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

警告:将缓冲较大或未知大小的响应正文。建议使用 getResponseBodyAsStream。

在代码中,无论如何我都必须将响应写入字节数组,所以我应该使用 getResponseBody() 方法。但是有没有一种简单的方法可以抑制警告消息,这样我就不必在每次运行时都查看它?

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

我的猜测是答案涉及 System.out 或 System.err 操作,但有没有好的方法呢?

【问题讨论】:

    标签: java console runtime warnings suppress-warnings


    【解决方案1】:

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

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

    之后,该警告应该消失

    【讨论】:

      【解决方案2】:

      简单地“保存”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);
      

      【讨论】:

        【解决方案3】:

        我建议您按照警告的建议进行操作,并使用流而不是字节数组。如果您尝试推送的响应特别大(假设它是一个大文件),您会将其全部加载到内存中,那将是一件非常糟糕的事情。

        使用流真的会更好。

        也就是说,您可以通过临时替换 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,否则即使该路线也会失败。

        【讨论】:

        • 我同意最好使用流,但就像现在一样,我需要放置响应的目标 API 是字节数组。如有必要,我们可以对 API 进行重构,使其能够获取流;那会更好。警告肯定是有原因的。
        • 作为权宜之计,您能以某种方式利用 ByteArrayOutputStream 吗?这可能会给你你需要的东西,从响应主体流中读取,然后以这种方式将其写入字节数组?
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          如果您想彻底停止此日志条目,则有一个触发警告的可调最大值。我看到了这个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 设置为所需值的地方。

          【讨论】:

          • 等着看我是否能得到更多答案以防万一,但是是的,我认为这将是我接受的答案。不过,其他一些回应也有其优点。
          • 有趣的是,设置参数似乎没有任何效果。无论我将参数设置为什么,我仍然会看到警告。很难理解为什么这不起作用:postMethod.getParams().setIntParameter(HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT, 1000000000);
          • 时间问题?在您的 getParams().setIntParameter() 清除参数之后,这听起来像是对 recycle() 或 setParams() 的调用。只是猜测......
          • 您缺少这部分语句: if ((contentLength == -1)... 如果源的内容长度未设置,警告将始终出现
          【解决方案6】:

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

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

          【讨论】:

          • 这对我很有帮助。是否有类似的方法来禁用所有日志消息(甚至是错误)?
          • @yellavon 你应该可以将级别设置为OFF
          【解决方案7】:

          假设警告已写入 stderr,您始终可以通过将 stderr 传送到 /dev/null 或系统上的任何等效项来抑制警告。

          【讨论】:

            猜你喜欢
            • 2011-03-25
            • 1970-01-01
            • 2015-06-02
            • 2014-12-08
            • 2013-07-11
            • 2019-05-08
            • 1970-01-01
            • 2011-01-21
            相关资源
            最近更新 更多