Подтвердить что ты не робот

Какой лучший способ подавить предупреждение консоли среды выполнения на Java?

Я использую метод getResponseBody() класса org.apache.commons.httpclient.methods.PostMethod. Тем не менее, я всегда получаю сообщение, записанное на консоль во время выполнения:

ПРЕДУПРЕЖДЕНИЕ: переход в тело ответа буфера большого или неизвестного размера. Рекомендуется использовать getResponseBodyAsStream.

В коде мне все равно нужно написать ответ на массив байтов, поэтому я должен использовать метод getResponseBody(). Но есть ли простой способ, чтобы я мог подавить предупреждающее сообщение, поэтому мне не нужно смотреть на него при каждом запуске?

Если это была ошибка компилятора, я бы использовал аннотацию @SuppressWarnings, но это не проблема времени компиляции; это происходит во время выполнения. Кроме того, я мог бы использовать getResponseBodyAsStream для записи в ByteArrayOutputStream, но это похоже на хакерский способ обойти предупреждение (дополнительные строки кода для выполнения того, что делает getResponseBody() для меня).

Я предполагаю, что ответ включает в себя манипуляции System.out или System.err, но есть ли хороший способ сделать это?

4b9b3361

Ответ 1

Я бы порекомендовал вам сделать то, что предлагает предупреждение, и использовать поток, а не массив байтов. Если ответ, который вы пытаетесь нажать, особенно большой (предположим, что это большой файл), вы загрузите все это в память, и это будет очень плохо.

Вам действительно лучше использовать потоки.

Тем не менее, вы можете взломать его, временно заменив 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);

Edit:

Я согласен с тем, что было бы предпочтительнее использовать потоки, но, как и сейчас, целевой API, где мне нужно response - массив байтов. Если необходимо, мы можем сделать рефакторинг для API, который позволит ему принять поток; это было бы лучше. предупреждение обязательно для причина.

Если вы можете изменить API, сделайте это. Потоковая обработка - лучший способ пойти в этом случае. Если вы не можете из-за внутреннего давления или чего-то еще, перейдите @John M и запустите BUFFER_WARN_TRIGGER_LIMIT, но убедитесь, что у вас есть известная длина contentLength или даже этот маршрут потерпит неудачу.

Ответ 2

Если вы хотите полностью остановить запись в журнале, есть настраиваемый макс, который вызывает предупреждение. Я видел этот смотрящий на код.

        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 в нужное значение.

Ответ 3

это предупреждение происходит, когда httpClient не имеет представления о длине возвращаемых данных вы должны установить атрибут длины содержимого на своем сервере

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

после этого это предупреждение должно исчезнуть

Ответ 4

Выводится ли библиотека через log4j? если это так, то редактирование log4j.properties для установки вывода для этого класса в "ERROR" будет работать, например.

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

Ответ 5

Эта проблема уже обсуждалась в ASF JIRA. Это можно решить двумя способами:

  • Задайте более высокое значение для BUFFER_WARN_TRIGGER_LIMIT. Достаточно высокая ценность, скорее всего, подавит предупреждение; однако это побеждает цель самого предупреждения. Если вы буферизируете большое количество данных, которые в конечном итоге разбираются за один проход, вам лучше не читать данные из потока в массив перед работой над массивом.
  • Установите уровень ведения журнала на более высокое значение для HttpClient, если вам удобно работать с ERROR или FATAL.

Ответ 6

Предполагая, что предупреждение записывается в stderr, вы всегда можете подавить предупреждение, указав stderr на /dev/null, или независимо от того, что эквивалентно в вашей системе.

Ответ 7

чтобы просто "сохранить" сообщения 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);