Cabeçalho para consumir WS da NFe

Galera a comunicação com o novo servico de status da nfe eu consegui fazer…
para o estado de sp e mg.

Porém minha duvida é a seguinte, para cada estado os metodos sao diferentes, ou seja terei que implementar uns 20 metodos de para cada servico ?

Alguem tem uma dica de como deixar a coisa mais “generica”

Att
Guilherme

Galera consegui fazer uma forma generica pra todos os estados…
pelo menos com a consulta de status funcionou…

agora vou começar os teste com um nfe completa.

Valew…

para resolver os problemas com os parsers eu uso o seguinte método

//create the builder StAXOMBuilder builder = new StAXOMBuilder(XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(XML))); //get the root element (in this case the envelope) OMElement documentElement = builder.getDocumentElement(); NfeRecepcao2Stub.NfeDadosMsg dadosMsg = new NfeRecepcao2Stub.NfeDadosMsg(); dadosMsg.setExtraElement(documentElement);
E funciona dah pra fazer ele ler de um file também…

eu nao uso os parsers que tem nos beans gerados pelo wsdl…
uso esse geito aqui!!
vlw…
foi só pra ajudar mesmo

Ola pessoal uso o Jax-Ws e Jaxb na NF-e, alguem ja teve este erro ?

javax.xml.bind.MarshalException
- with linked exception:
[javax.xml.bind.JAXBException: class sefaz2.entity.ConsStatServ nor any of its super class is known to this context.]


com.sun.xml.internal.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:303)
com.sun.xml.internal.ws.message.AbstractMessageImpl.writeTo(AbstractMessageImpl.java:128)
com.sun.xml.internal.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:94)
com.sun.xml.internal.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:251)
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:130)
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:74)
com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:581)
com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:540)
com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:525)
com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:422)
com.sun.xml.internal.ws.client.Stub.process(Stub.java:235)
com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:120)
com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:230)
com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:210)
com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:103)
$Proxy30.nfeStatusServicoNF2(Unknown Source)
sefaz2.servico.WebServiceStatus.getResponse(WebServiceStatus.java:36)
sefaz2.servico.WebService.callSefaz(WebService.java:184)
sefaz2.servico.WebServiceStatus.call(WebServiceStatus.java:57)

Aix, não sei se é teu caso, pois essa mensagem é estranha. Porém cabe lembrar que o JAXB não sabe muito bem trabalhar com classes abstratas e nem mesmo interfaces. Nesses casos você precisa usar sempre a classe concreta, exemplo ArrayList ao invés de List.

Fala povo… seguinte… tenho uma dúvida, pode ser meio tola, mas gostaria da opinião de vocês para fazer da forma correta.

Vou colocar o sistema em produção, logo tenho que apontar para o webservice de produção.
Estou utilizando o axis2, com os stubs criados pelo wsdl2java dele.

Minha dúvida é: Qual a maneira correta para mudar o ambiente?
-Simplesmente alterar as 3 URLs que estão dentro dos stubs para apontar para produção e não mais homologação?
-Gerar os stubs novamente com o wsdl de produção, perdendo a garnatia do que eu ja tinha testato não funcionar com os novos stubs?
Alguém pode me dar um direcionamento?

Grato,
Marco.

Gera os stubs novamente para produção, se vc testou todos serviços em homologação vai funcionar certo, mas vc ainda pode testar o status do serviço em produção e se ainda quiser ter real certeza envia uma nota e depois cancela ela, abraços.

Olá pessoal,
Estou com este problema quando envio ao WS do Sefaz, mais especificamente o WS de RetRecepcao:
“Rejeicao: Uso de prefixo de namespace nao permitido”

Li vários tópicos nos fóruns aqui do guj mas ainda estou com problemas na comunicação com o Sefaz, estou trabalhando CXF, que utiliza JAXB para marshalling e unmarshaling de objetos, e estou trabalhando inteiramente com objetos, recebo e transmito sem manipular TAGs XMLs. Isso significa que não tenho controle do XML enviado ao WS. E quando envio está retornando esta mensagem.

SOAP Gerado:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header> <nfeCabecMsg xmlns:ns2="http://www.portalfiscal.inf.br/nfe" xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetRecepcao2"> <cUF>42</cUF> <versaoDados>2.00</versaoDados> </nfeCabecMsg> </soap:Header> <soap:Body> <nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetRecepcao2" xmlns:ns2="http://www.portalfiscal.inf.br/nfe"> <ns2:consReciNFe versao="2.00"> <ns2:tpAmb>2</ns2:tpAmb> <ns2:nRec>423000006484951</ns2:nRec> </ns2:consReciNFe> </nfeDadosMsg> </soap:Body> </soap:Envelope>

Já testei pela ferramenta soapUI e a única coisa que falta é remover os prefixos “ns2” desse código SOAP, mas não sei como fazer isso pois não manipulo os prefixos via objeto.
Podem me ajudar?

[quote=rodrigobraz]olá!

estou usando o netbeans pra gerar os códigos do webservice e ele gerou o código abaixo:

[code]br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServico2 service =
new br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServico2();
br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServico2Soap12 port =
service.getNfeStatusServico2Soap12();

    br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServicoNF2.NfeDadosMsg nfeDadosMsg =
            new br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServicoNF2.NfeDadosMsg();

    br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServicoNF2Response.NfeStatusServicoNF2Result result =
            port.nfeStatusServicoNF2(nfeDadosMsg);

    System.out.println("Result = " + result);[/code]

alguém sabe como usar isso?
como passar as informações sobre cabeçalho e dadosnfe para esse método?

vlw![/quote]
Como você fez no Netbeans para gerar essas classes?

Estou usando o NB 6.9 (aplicação Swing), já tenho o XML gerado, assinado e validado, agora preciso iniciar verificando o status do serviço e depois fazer o envio.

Alguém já conseguiu resolver estes problemas de namespace? se sim, podem me dar um help?
marcelomrwin@gmail.com

estou testando o envio do lote para o ambiente de homologação da Sefaz/PR mas, ao consultar o recibo do lote e a nota, aparece o erro:
Falha no schema XML. org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element ‘NFe’

eu monto o xml de lote corretamente… valido com o schema e ta tudo certo, mas ta dando esse erro!

alguém já passou por isso?

vlw

Estou com o mesmo problema. Já desisti do SAX e estou tentando criar a mensagem SOAP.
tenho a String envelope:
“…env:Body234<infNFe Id…”
Note-se o namespace na tag NFe.
No entanto, ao executar o código final ByteArrayInputStream inn = new ByteArrayInputStream(envelope.getBytes()); final MimeHeaders header = new MimeHeaders(); header.addHeader("Content-Type", "application/soap+xml"); javax.xml.soap.SOAPMessage message = factory.createMessage(header, inn); final ByteArrayOutputStream in = new ByteArrayOutputStream(); message.writeTo(in); System.out.println("in :\n"+in.toString());

O namespace da tag Nfe não é impresso. Sendo removido o namespace ocorre o mesmo erro mencionado pelo rodrigobraz.
Alguém tem alguma dica? Falta algum parâmetro para a criação do SoapMessage?

Obrigado

ingo_nh, eu consegui autorizar uma nota na sefaz/pr.

tbem deixei o axis e montei a msgem soap na mão.

olha só:

[code]StringBuilder soapMessage = new StringBuilder();
soapMessage.append("<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?>")
.append("<soap12:Envelope xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:soap12=“http://www.w3.org/2003/05/soap-envelope">")
.append(”<soap12:Header>")
.append("<nfeCabecMsg xmlns=“http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2">")
.append(”<versaoDados>2.00</versaoDados>")
.append("<cUF>41</cUF>")
.append("</nfeCabecMsg>")
.append("</soap12:Header>")
.append("<soap12:Body>")
.append("<nfeDadosMsg xmlns=“http://www.portalfiscal.inf.br/nfe">")
.append(_nfeDadosMsg)
.append(”</nfeDadosMsg>")
.append("</soap12:Body>")
.append("</soap12:Envelope>");

    MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);

    MimeHeaders header = new MimeHeaders();
    header.addHeader("Content-Type", "application/soap+xml");

    SOAPMessage message = factory.createMessage(
            header, new ByteArrayInputStream(soapMessage.toString().getBytes()));
    SOAPConnection con = SOAPConnectionFactory.newInstance().createConnection();
    URL url = new URL("https://homologacao.nfe2.fazenda.pr.gov.br/nfe/NFeRecepcao2");
    SOAPMessage res = con.call(message, url);
    con.close();

    StringWriter sw = new StringWriter();
    Source source = new DOMSource(
            res.getSOAPPart().getEnvelope().getBody().getFirstChild().getFirstChild());
    TransformerFactory.newInstance().newTransformer().transform(
            source, new StreamResult(sw));

    return sw.toString();[/code]

t+

Obrigado pelo retorno.

Mas e após criar o seu SoapMessage, se incluir:

            final ByteArrayOutputStream in = new ByteArrayOutputStream();   
            message.writeTo(in);
            System.out.println("in :\n"+in.toString());

Imprime o namespace nas tags enviNfe e Nfe? No meu caso está perdendo o namespace nas tags filhas, mesmo que na string inicial esteja explícito…
E na tag nfeDados, incluiste namespace?

cara, esse seu código ae é só para mostrar no console o xml que vc está enviando, não é?!

não entendi muito bem sua dúvida…

sei que dá para mostrar o xml q está enviando e recebendo de resposta tipo o seu código:

[code]ByteArrayOutputStream in = new ByteArrayOutputStream();
message.writeTo(in);
System.out.println(“Xml de entrada:”);
System.out.println(“in :\n”+in.toString());

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    res.writeTo(out);
    System.out.println("Xml de resposta:");
    System.out.println("out :\n" + out.toString());[/code]

na tag nfeDados coloquei o namespace sim, como passei no código:
.append("<nfeDadosMsg xmlns="http://www.portalfiscal.inf.br/nfe">")

Ocorre que após transmitir a NFe, consultar o recibo e depois consultar a NFe, tenho como retorno: Falha no schema XML. org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element ‘NFe’.
Pelo que vi nos fóruns e até no site da SEFAZ PR, é necessário que tenha o namespace declarado na tag NFe.
O código que postei realmente apenas imprime no console. Acontece que tenho uma String inicial (para transmitir) que contém o namespace na tag NFe, só que após o

SOAPMessage message = factory.createMessage(header, inn);
message.writeTo(in);   
System.out.println("in :\n"+in.toString());   

não é impresso o namespace. Não sei porque o createMessage retira o namespace.

eu tbém estava com esse erro, mas pelo método que postei acima funcionou!

vc tentou??

.append("&lt;soap12:Body&gt;") .append("&lt;nfeDadosMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\"&gt;") .append("&lt;enviNFe xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"2.00\"&gt;") .append("&lt;idLote&gt;numero do lote&lt;/idLote&gt;") .append("&lt;NFe xmlns=\"http://www.portalfiscal.inf.br/nfe\"&gt;......&lt;/NFe&gt;") .append("&lt;/enviNFe&gt;") .append("&lt;/nfeDadosMsg&gt;") .append("&lt;/soap12:Body&gt;")

Sim. Tentei exatamente assim.
Mas parece que o factory.createMessage está tirando os namespaces da tag NFe.

ingo_nh, conseguiu resolver o problema?

eu tinha conseguido autorizar uma nota com o método que passei acima, mas agora voltou a dar o erro de falha no schema.

eu mostrei a saída do xml que ele monta e realmente ta retirando o namespace.

to achando que é alguma atualização do java…

vou dar uma olhada e qquer coisa aviso!

t+

percebi uma coisa…

o namespace está sendo retirado quando o namespace da tag é igual ao namespace da tag pai!

por exemplo:

<soap12:Body>
<nfeDadosMsg xmlns=“http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2”>
<enviNFe xmlns=“http://www.portalfiscal.inf.br/nfe” versao=“2.00”>
<idLote>010000000000077</idLote>
<NFe xmlns=“http://www.portalfiscal.inf.br/nfe”>

neste caso o namespace da tag NFe é o mesmo da tag pai, enviNFe.

eu fiz um teste trocando o namespace de enviNFe para o mesmo que está na tag nfeDadosMsg e o namespace de NFe não foi retirado, mas o do enfiNFe foi, porque era o mesmo da tag pai!

será que existe algum parâmetro ou propriedade que dê para definir na montagem do soap para que não faça isso?!

tamo quase =]