为什么我只能在RESTlet中将Representation转换为字符串一次?

时间:2010-09-29 04:45:52

标签: java rest restlet

所以, 我正在尝试使用getText()或write()方法将Representation转换为String或StringWriter。看来我只能在一个Representation上成功调用这个方法...如果我再次调用该方法,它会在第二次调用时返回null或空字符串。为什么是这样?我希望每次都能回复同样的事情:

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 个答案:

答案 0 :(得分:4)

javadocs解释了这一点:

  

表示的内容可以是   如果有的话,检索几次   稳定和可访问的来源,如a   本地文件或字符串。当。。。的时候   表示通过a获得   像网络一样的临时来源   socket,其内容只能是   检索一次。

所以可能是直接从网络或类似的东西中读取它。

您可以致电isTransient()进行检查。如果您需要能够多次读取它,可能您应该将其转换为字符串,然后从该字符串中创建一个新的Representation

答案 1 :(得分:2)

这是因为一般情况下,表示实际上并没有从InputStream读入,直到你用getText()请求它,一旦你要求它,所有的字节都被读取并转换成字符串。

这是效率的自然实现:不是创建一个可能非常大的String,然后将该String转换为有用的东西(JSON对象,DOM树或其他),而是编写转换器以对InputStream进行操作,避免制作和阅读巨大字符串的成本。

因此,例如,如果您将大型XML文件PUT转换为Web服务,则可以将InputStream直接提供给SAX解析器。

(正如@John所说,StringRepresentation包装了一个String,因此可以多次读取。但是你必须读取一个Request的表示,这很可能是一个InputRepresentation。)