NF-e 2.0, serviço de envio de notas

Estou brigando há 1 semana com o serviço de envio de notas da NF-e 2.0.

Já consegui comunicar com a SEFAZ (consulta status do serviço), logo meus certificados e o restante está ok.

A única coisa que está pegando é que eles modificaram o tipo do parâmetro de dados de string (versão 1.10) para XML (versão 2.0). No entanto, ao enviar a nota assinada ele está “transformando” meu XML, como se de fato ele fosse uma string. Logo, deixando de funcionar.

Estou utilizando o JAX para a comunicação. Alguém tem alguma ideia sobre como enviar uma String sem que o Java tente “corrigir” nosso conteúdo?

Eu uso o Axis2 para a comunicação com os webservices de SP e está tudo funcionando (pelo menos no ambiente de homologação).

Se puder postar algum código e também a descrição do problema.

Na verdade, eu estressei com as classes dando esses erros e fiz no melhor estilo “Chuck Norris Mode”. Chamei os procedimentos da SEFAZ como se fosse um serviço HTTP comum, montando o XML no braço e funcionou tudo certo. Não ficou elegante mas me resolveu. Talvez mais pra frente eu volte à verificar como resolver o problema anterior.

Abaixo, trecho para enviar a mensagem para quem estiver sofrendo e quiser uma luz.

// Preparando conexão SSL - Tem vários exemplos no GUJ para certificado A1 e A3 prepararSSL(); // Montando XML de envio no braço String mensagem = "<?xml .........."; URL u = new URL(caminhoWebService); HttpURLConnection connection = (HttpURLConnection) u.openConnection(); connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); connection.connect(); enviarEnvelopeXML(connection, mensagem); String xmlRetornado = getResposta(connection);

Método de envio

private void enviarEnvelopeXML(HttpURLConnection connection, String envelopeXML) throws IOException { OutputStream out = connection.getOutputStream(); Writer wout = new OutputStreamWriter(out); wout.write(envelopeXML); wout.flush(); wout.close(); }

Método de tratamento de retorno

[code] private String getResposta(HttpURLConnection connection) throws ParserConfigurationException, IOException, SAXException {
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream in = connection.getInputStream();

    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    StringBuilder sb = new StringBuilder();
    String line = null;

    while ((line = br.readLine()) != null) {
        sb.append(line);
    }

    br.close();
    in.close();
    return sb.toString();
}[/code]

Inté.

Com o HttpConnection acho que você não vai ter muito sucesso,

O jeito mais fácil é usando um SoapMessage, ai vc escreve o XML inteiro do SOAP, incluindo o envelope e envia. Simples e fácil.

Não tenho um exemplo pra te mostrar, eu perdi o meu que eu usava pra comparar o soap que tinha que enviar com o soap que o Axis2 enviava

Obs:

na versão 1.0, vc devia enviar uma string, ai tinha que converter os < e > para as respectivas entidades html, agora o que vc deve enviar é o xml inteiro

Zoren, esse exemplo acima está funcionando. Inclusive tive que escrever o XML inteiro do SOAP.

Inté.

É justamente este o problema que eu grilei com o JAX. Talvez por não saber como fazer isto da melhor maneira, admito. Mas ficar mapeando o XML inteiro como tive que fazer no processo de verificação do status é que eu não vou ficar fazendo.

Inté.