Почему я получаю InvalidProtocolBufferException при создании Message.Builder из байтового массива, но не InputStream? - PullRequest
1 голос
/ 05 февраля 2011

Я работаю над сервлетом и пытаюсь регистрировать запросы. Важной частью кода, вызывающего ошибку, является следующее:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    StringWriter writer = new StringWriter();
    IOUtils.copy(request.getInputStream(), writer);
    Message.Builder builder = something of type com.google.protobuf.GeneratedMessage.Builder;
    builder.mergeFrom(writer.toString().getBytes());
}

Последняя строка кода выше приводит к следующему исключению:

com.google.protobuf.InvalidProtocolBufferException: Protocol message tag had invalid wire type.

Однако, когда код переключен на:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    Message.Builder builder = something of type com.google.protobuf.GeneratedMessage.Builder;
    builder.mergeFrom(request.getInputStream());
}

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

Ответы [ 2 ]

1 голос
/ 05 февраля 2011

Как насчет этого?

InputStream inputStream = request.getInputStream();

byte[] data = IOUtils.toByteArray(inputStream);
Message.Builder builder = something of type com.google.protobuf.GeneratedMessage.Builder;
builder.mergeFrom(data);

// then use inputStream for something else
0 голосов
/ 11 февраля 2011

Очевидно, мне нужно было использовать кодированные потоки ввода и вывода, чтобы данные могли быть прочитаны правильно. Смотрите мой ответ на другой мой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...