Какой лучший способ подавить предупреждение консоли среды выполнения на Java?
Я использую метод getResponseBody() класса org.apache.commons.httpclient.methods.PostMethod. Тем не менее, я всегда получаю сообщение, записанное на консоль во время выполнения:
ПРЕДУПРЕЖДЕНИЕ: переход в тело ответа буфера большого или неизвестного размера. Рекомендуется использовать getResponseBodyAsStream.
В коде мне все равно нужно написать ответ на массив байтов, поэтому я должен использовать метод getResponseBody(). Но есть ли простой способ, чтобы я мог подавить предупреждающее сообщение, поэтому мне не нужно смотреть на него при каждом запуске?
Если это была ошибка компилятора, я бы использовал аннотацию @SuppressWarnings, но это не проблема времени компиляции; это происходит во время выполнения. Кроме того, я мог бы использовать getResponseBodyAsStream для записи в ByteArrayOutputStream, но это похоже на хакерский способ обойти предупреждение (дополнительные строки кода для выполнения того, что делает getResponseBody() для меня).
Я предполагаю, что ответ включает в себя манипуляции System.out или System.err, но есть ли хороший способ сделать это?
Ответы
Ответ 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);