Pessoa, estou brincando com axis e estou com uma dificuldade. Apartir do wsdl do serviço do CT-e gerei as classes de serviço de consulta.
Gerei o soap no braço e funciona que uma maravilha, não satisfeito quero fazer com o axis, assim como fiz com a nfe. No entanto a falta de conhecimento em alguns conseitos do axis e da sua estrutura não estou conseguindo fazer com que o meu xml seja carregado com o CteDadosMsg no body do envelop.
Meu codigo:
[code] CteCabecMsg cab = new CteCabecMsg();
cab.setCUF("51");
cab.setVersaoDados("1.01");
SOAPHeaderElement soaHead = new SOAPHeaderElement("http://www.portalfiscal.inf.br/cte/wsdl/CteStatusServico","cteCabecMsg", cab);
TConsStatServCte servico = new TConsStatServCte();
servico.setTpAmb("2");
servico.setVersao("1.01");
servico.setXServ("STATUS");
ByteOutputStream out = new ByteOutputStream();
JAXBContext cont = JAXBContext.newInstance("br.inf.portalfiscal.cte");
Marshaller marshaller = cont.createMarshaller();
marshaller.marshal(servico, out);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(out.toString().getBytes()));
Node element = doc.getDocumentElement().getFirstChild().getNextSibling();
Element el = (Element) element;
System.out.println(out); //saida do xml gerado do TConsultaServCTe
CteDadosMsg dados = new CteDadosMsg();
dados.set_any(new MessageElement[]{new org.apache.axis.message.MessageElement(el)});
CteStatusServicoLocator locator = new CteStatusServicoLocator("https://cte.sefaz.mt.gov.br/ctews/services/CteStatusServico");
CteStatusServicoSoap12Stub soap = (CteStatusServicoSoap12Stub) locator.getCteStatusServico();
soap.setHeader(soaHead);
CteStatusServicoCTResult ob = soap.cteStatusServicoCT(dados);
System.out.println(ob.get_any()[0]); //retorno
org.apache.axis.client.Call axis = soap._getCall();
MessageContext gen = axis.getMessageContext();
Message msg = gen.getRequestMessage();
SOAPEnvelope replyDoc = msg.getSOAPEnvelope();
System.out.println(replyDoc.getAsString()); //Saida do envelope enviado.[/code]
No entanto o envelope enviado é gerado pelo axis desta forma:
Se alguem souber informar o que estou fazendo de errado agradeço. O objetivo é fazer um tutorial do uso do axis, jaxb e conexão CT-e.
Caso tenha algum interessado em ajudar.
Oi Michel, muito bom seu exemplo.
Vc gerou as classes java do *.wsdl com axis?
Poderia postar um exemplo?
Ou então postar o método setHeader() do soap(CteStatusServicoSoap12Stub),
porque ai colocaria manualmente mesmo. Eu gerei as classes atraves do JAX-WS.
Vlw, obrigado.
[quote=vm]Boa noite
Bom, acredito que não tenham conhecimento e precise de ajuda da um grito.
Quando sobrar uns minutos posto a solução passo-a-passo, mas deixo o codigo.
CteCabecMsg cab = new CteCabecMsg();
cab.setCUF("51");
cab.setVersaoDados("1.02");
SOAPHeaderElement soaHead = new SOAPHeaderElement("http://www.portalfiscal.inf.br/cte/wsdl/CteStatusServico","cteCabecMsg", cab);
TConsStatServCte servico = new TConsStatServCte();
servico.setTpAmb("2");
servico.setVersao("1.01");
servico.setXServ("STATUS");
ByteOutputStream out = new ByteOutputStream();
JAXBContext cont = JAXBContext.newInstance("br.inf.portalfiscal.cte");
Marshaller marshaller = cont.createMarshaller();
marshaller.marshal(servico, out);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new ByteArrayInputStream(getDados().getBytes()));
Node element = doc.getDocumentElement();
Element el = (Element) element;
System.out.println(out); //saida do xml gerado do TConsultaServCTe
CteDadosMsg dados = new CteDadosMsg();
dados.set_any(new MessageElement[]{new org.apache.axis.message.MessageElement(el)});
CteStatusServicoLocator locator = new CteStatusServicoLocator("https://cte.sefaz.mt.gov.br/ctews/services/CteStatusServico");
CteStatusServicoSoap12Stub soap = (CteStatusServicoSoap12Stub) locator.getCteStatusServico();
soap.setHeader(soaHead);
CteStatusServicoCTResult ob = soap.cteStatusServicoCT(dados);
System.out.println(ob.get_any()[0]); //retorno
org.apache.axis.client.Call axis = soap._getCall();
MessageContext gen = axis.getMessageContext();
Message msg = gen.getRequestMessage();
SOAPEnvelope replyDoc = msg.getSOAPEnvelope();
System.out.println(replyDoc.getAsString()); //Saida do envelope enviado.
Tentei com o axis 2 no NetBeans, mais não tive muito sucesso!!!
Usei esse tutorial pra instalar: http://netbeans.org/kb/docs/websvc/gs-axis.html
As classe geradas pelo Axis 2 foram diferentes, e não tenho muito tempo para estudar e
testar…
[quote=vm]Foi gerado com axis1.
O header o axis seta é so jogar o objeto de cabecalho.
Eu consegui colocar os Cabeçalhos gerado pelo JAX WS.
Usei o wsimport no pacote lib da java com o parâmetro: -XadditionalHeaders
“leverage SunRI tool (wsimport), which starting from v. 2.1.3 has a new option -XadditionalHeaders that map additional headers in wsdl:binding section as method parameters.” http://community.jboss.org/thread/102562
O código ficou assim:
TConsStatServ ct = new br.inf.portalfiscal.cte.ObjectFactory().createTConsStatServ();
ct.setVersao("1.03");
ct.setTpAmb("1");
ct.setXServ("STATUS");
CteDadosMsg dados = new CteDadosMsg();
dados.getContent().add(ct);
Holder<CteCabecMsg> cabDados = new Holder<CteCabecMsg>();
cabDados.value = new CteCabecMsg();
cabDados.value.setCUF("29");
cabDados.value.setVersaoDados("1.03");
CteStatusServico status = new CteStatusServico();
CteStatusServicoSoap12 soap = status.getCteStatusServicoSoap12();
CteStatusServicoCTResult result = soap.cteStatusServicoCT(dados, cabDados);
System.out.println(result.getContent().size());
JAXBElement el = (JAXBElement) result.getContent().get(0);
TRetConsStatServ retorno = (TRetConsStatServ) el.getValue();
System.out.println(retorno.getXMotivo());
System.out.println(retorno.getXObs());
[quote=dsmdanbr]Tentei com o axis 2 no NetBeans, mais não tive muito sucesso!!!
Usei esse tutorial pra instalar: http://netbeans.org/kb/docs/websvc/gs-axis.html
As classe geradas pelo Axis 2 foram diferentes, e não tenho muito tempo para estudar e
testar…
[quote=vm]Foi gerado com axis1.
O header o axis seta é so jogar o objeto de cabecalho.
[quote=dsmdanbr]Eu consegui colocar os Cabeçalhos gerado pelo JAX WS.
Usei o wsimport no pacote lib da java com o parâmetro: -XadditionalHeaders
“leverage SunRI tool (wsimport), which starting from v. 2.1.3 has a new option -XadditionalHeaders that map additional headers in wsdl:binding section as method parameters.” http://community.jboss.org/thread/102562
O código ficou assim:
TConsStatServ ct = new br.inf.portalfiscal.cte.ObjectFactory().createTConsStatServ();
ct.setVersao("1.03");
ct.setTpAmb("1");
ct.setXServ("STATUS");
CteDadosMsg dados = new CteDadosMsg();
dados.getContent().add(ct);
Holder<CteCabecMsg> cabDados = new Holder<CteCabecMsg>();
cabDados.value = new CteCabecMsg();
cabDados.value.setCUF("29");
cabDados.value.setVersaoDados("1.03");
CteStatusServico status = new CteStatusServico();
CteStatusServicoSoap12 soap = status.getCteStatusServicoSoap12();
CteStatusServicoCTResult result = soap.cteStatusServicoCT(dados, cabDados);
System.out.println(result.getContent().size());
JAXBElement el = (JAXBElement) result.getContent().get(0);
TRetConsStatServ retorno = (TRetConsStatServ) el.getValue();
System.out.println(retorno.getXMotivo());
System.out.println(retorno.getXObs());
[quote=dsmdanbr]Tentei com o axis 2 no NetBeans, mais não tive muito sucesso!!!
Usei esse tutorial pra instalar: http://netbeans.org/kb/docs/websvc/gs-axis.html
As classe geradas pelo Axis 2 foram diferentes, e não tenho muito tempo para estudar e
testar…
[quote=vm]Foi gerado com axis1.
O header o axis seta é so jogar o objeto de cabecalho.
Sds[/quote][/quote][/quote]Amigo será que você não teria um exemplo de como você está fazendo para gerar o XML do CT-e?