Erro ao receber uma String no XFIRE, WebService Client

8 respostas
Pedrosa

Tenho o seguinte caso estou trafegando Strings xml por webservice, consegui reduzir bruscamente o tamanho dessas Strings através do Xtream com referencias porém a String continua grande consegui então comprimi essa String reduzindo mais ainda o tamanho porém o Client gera uma exceção.

Exception in thread "main" org.codehaus.xfire.fault.XFireFault: Could not read XML stream.. Nested exception is com.ctc.wstx.exc.WstxParsingException: Expected a text token, got START_ELEMENT.
 at [row,col {unknown-source}]: [1,481]

No meu metodo comprimo dessa forma a String:

return new String(new ManipulaStringZip().compress(result), "ISO-8859-1");

No server descomprimo perfeitamente assim:

System.out.println("string descomprimida \n" + new ManipulaStringZip().decompress(new LotesImpressaoDAO().getImpressaoEnvelope(5).getBytes("ISO-8859-1")));

Porém no Client ao tentar descomprimir assim gera a exceção:

return new String(new ManipulaStringZip().decompress(resultado[0].toString()), "ISO-8859-1");

Alguém tem idéia do que pode estar acontecendo?

8 Respostas

F

Pedrosa:

Porém no Client ao tentar descomprimir assim gera a exceção:

return new String(new ManipulaStringZip().compress(resultado[0].toString()), "ISO-8859-1");

Alguém tem idéia do que pode estar acontecendo?

return new String(new ManipulaStringZip().[b]compress/b, “ISO-8859-1”);

talvez porque você esteja tentando descomprimir comprimindo :?:

Pedrosa

Postei errado o certo é decompress mesmo!, mas causa o mesmo erro, qualquer coisa que chegue no cliente com esse charset causa a Exception!

Pedrosa

Qualquer charset que eu passe para o Client do XFire ele causa a exceção, a questão é quando eu comprimo os dados esse método retorma um array de bytes, mas não posso passar esse tipo, sendo assim uso a Classe String para transformar esse array em String passando o charset:

new String(new ManipulaStringZip().compress(result),"ISO-8859-1");

Em uma classe normal para fazer o processo inverso uso:

System.out.println(new ManipulaStringZip().decompress(new LotesImpressaoDAO().getImpressaoEnvelope(5).getBytes("ISO-8859-1")));

ManipulaStringZip

public byte[] compress(String str) throws IOException {
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   ZipOutputStream zout = new ZipOutputStream(out);
   zout.putNextEntry(new ZipEntry("0"));
   zout.write(str.getBytes());
   zout.closeEntry();
   byte[] compressed = out.toByteArray();
   zout.close();
   return compressed;
}
public final String decompress(byte[] compressed) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ByteArrayInputStream in = new ByteArrayInputStream(compressed);
    ZipInputStream zin = new ZipInputStream(in);
    ZipEntry entry = zin.getNextEntry();
    byte[] buffer = new byte[1024];
    int offset = -1;
    while((offset = zin.read(buffer)) != -1) {
        out.write(buffer, 0, offset);
    }
    String decompressed = out.toString();
    out.close();
    zin.close();
    return decompressed;
}

Alguma sugestão?

F

Deixa eu ver se entendi…

Voce gerou um cliente de WS com o xfire, quer enviar através dele uma String. Essa string foi comprimida, transformada em um array de bytes e atraves disso vc tenta construir uma nova String usando String(byte[],charset) para enviar pelo cliente.

O erro da na hora que voce tenta enviar essa string montada a partir da compressao de uma outra string… é isso?

Pedrosa

É na verdade eu gerei um serviço no server para ser consumido no client, e fazendo um outro teste pelo NetBeans que por sinal simplifica em muito na hora de trabalhar com ws, gera um erro semelhante.

F

Voce consegue transportar uma string “normal” tipo “teste” ou tambem da erro?

Pedrosa

A comunicação com Strings normais funciona perfeitamente, porem quando eu mando minha string comprimida gera o erro pois a mesma contém diversos caracters especias representando os bytes comprimidos.

F

Você já pesquisou alguma coisa sobre o Xfire comprimir os dados que trafegam ao invés de você mesmo ter que comprimi-los na mão? ou declarar os dados como um “stream” mesmo ao invés de string, seria como se vc tivesse trafegando um arquivo zipado que na verdade é um arquivo texto…

porque uma string não é a mesma coisa que algo binário… e a partir do momento em que voce comprime voce tem dados binários e nao mais texto plano

Criado 28 de fevereiro de 2007
Ultima resposta 1 de mar. de 2007
Respostas 8
Participantes 2