Boa noite
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:
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.
No entanto o envelope enviado é gerado pelo axis desta forma:
<soapenv:Envelope
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<ns1:cteCabecMsg
soapenv:role="http://schemas.xmlsoap.org/soap/actor/next"
soapenv:mustUnderstand="false"
xmlns:ns1="http://www.portalfiscal.inf.br/cte/wsdl/CteStatusServico">
<ns1:cUF>51</ns1:cUF>
<ns1:versaoDados>1.01</ns1:versaoDados>
</ns1:cteCabecMsg>
</soapenv:Header>
<soapenv:Body>
<cteDadosMsg
xmlns="http://www.portalfiscal.inf.br/cte/wsdl/CteStatusServico">
<ns2:xServ xmlns:ns2="http://www.portalfiscal.inf.br/cte">
STATUS
</ns2:xServ>
</cteDadosMsg>
</soapenv:Body>
</soapenv:Envelope>
O xml gerado pelo JAX-b:
<?xml version="1.0" encoding="UTF-8"?>
<consStatServCte xmlns="http://www.portalfiscal.inf.br/cte"
versao="1.01">
<tpAmb>2</tpAmb>
<xServ>STATUS</xServ>
</consStatServCte>
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.