Почему я могу преобразовать Представление в строку только один раз в RESTlet? - PullRequest
1 голос
/ 29 сентября 2010

Итак, Я пытаюсь преобразовать представление в String или StringWriter, используя метод getText () или write (). Кажется, я могу вызвать этот метод только один раз успешно для Представления ... Если я вызову метод снова, он возвращает пустую или пустую строку во втором вызове. Почему это? Я ожидаю, что он будет возвращать одно и то же каждый раз:

public void SomeMethod(Representation rep)
{
    String repAsString = rep.getText();  // returns valid text for example: <someXml>Hello WOrld</someXml>

    String repAsString2 = rep.getText(); // returns null...  wtf?
}

Если я «делаю это неправильно», то я буду открыт для любых предложений относительно того, как мне получить эти данные.

Ответы [ 2 ]

4 голосов
/ 29 сентября 2010

Javadocs объясняют это:

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

Итак, предположительно, он читается напрямую из сети или что-то подобное.

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

2 голосов
/ 29 сентября 2010

Это потому, что в общем случае представление фактически не читается из InputStream, пока вы не запросите его с помощью getText (), и как только вы попросите его, все байты будут прочитаны и преобразованы в строку.

Это естественная реализация для эффективности: вместо того, чтобы создавать потенциально очень большую строку и затем конвертировать эту строку в нечто полезное (объект JSON, дерево DOM или что-то еще), вы пишете свой конвертер для работы с ним.Вместо этого InputStream, избегая затрат на создание и чтение этой огромной String.

Так, например, если у вас есть большой XML-файл, помещаемый в веб-службу, вы можете передать InputStream прямо в SAX-анализатор.1005 *

(Как отмечает @John, StringRepresentation оборачивает строку и может считываться несколько раз. Но вы должны читать представление запроса, которое, скорее всего, является InputRepresentation.)

...