Jersey 1.8 (Custom) Logging filter

сеть.xml имел

<init-param>
  <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
  <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
<init-param>
  <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
  <param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>

При этом не печатается объект входящего запроса. Он только печатает заголовки и другие вещи. Сущность запроса печатается как пустая строка

Затем я взял ссылочный код из LoggingFilter, чтобы узнать, почему он не работает

    final StringBuilder b = new StringBuilder();
    printRequestLine(b, request);
    printRequestHeaders(b, request.getRequestHeaders());


    ByteArrayOutputStream out = new ByteArrayOutputStream();
    InputStream in = request.getEntityInputStream();
    try {
        if(in.available() > 0) {
            ReaderWriter.writeTo(in, out);

            byte[] requestEntity = out.toByteArray();
            printEntity(b, requestEntity);

            request.setEntityInputStream(new ByteArrayInputStream(requestEntity));
        }
        return request;
    } catch (IOException ex) {
        throw new ContainerException(ex);
    } finally {
        logger.info(b.toString());
    }

InputStream держит объект

org.apache.catalina.connector.CoyoteInputStream

Если удалить условие if(in.доступный () > 0) этот код работает и печатает запрос

в.available() всегда возвращает 0, если входной поток удерживает входящий запрос

В каком случае код завершится ошибкой, если я удалю это условие?
И по какой причине он не дает мне доступного () значения?

1 ответ