¿Por qué sólo puedo convertir una representación de una cadena de vez en Restlet?
Pregunta
Por lo tanto, Estoy tratando de convertir una representación de una cadena o una StringWriter ya sea usando el método getText () o escribir (). Parece que sólo puedo llamar a este método una vez con éxito en una representación ... Si yo llamo el método de nuevo, se devuelve un valor nulo o una cadena vacía en la segunda llamada. ¿Por qué es esto? Yo esperaría que retorne la misma cosa cada vez:
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?
}
Si estoy "haciendo mal", entonces yo estaría abierto a cualquier sugerencia en cuanto a cómo puedo llegar a esos datos.
Solución
Los javadocs explican esto:
El contenido de una representación puede ser recuperado varias veces si hay una fuente estable y accesible, como una archivo local o una cadena. Cuando el representación se obtiene a través de una fuente temporal como una red socket, su contenido sólo puede ser recuperado una vez.
Por lo tanto es de suponer que está siendo leído directamente desde la red o algo similar.
Se puede comprobar esto llamando isTransient()
. Si tiene que ser capaz de leer varias veces, es de suponer que debe convertirla en una cadena y luego crear una nueva Representation
de esa cadena.
Otros consejos
Se debe a que, en general, la Representación en realidad no queda leer desde el InputStream hasta que la solicita con getText (), y una vez que has pedido, todos los bytes han sido leído y convertido en la cadena.
Esta es la aplicación natural para la eficiencia: en lugar de crear un potencial muy grande cadena y luego convertir esa cadena en algo útil (un objeto JSON, un árbol DOM, o lo que sea), se escribe su convertidor para operar en el InputStream vez , evitando los costes de fabricación y la lectura de ese enorme cadena.
Así, por ejemplo, si tiene un archivo XML grandes son puestos en un servicio web, se puede alimentar a la derecha InputStream en un analizador SAX.
(notas Como @ John, un StringRepresentation envuelve una cadena, y así se puede leer varias veces. Pero usted debe estar leyendo la representación de una solicitud, que es más probable un InputRepresentation.)