Pessoal,
Estou acessando um WS com JAX-WS e preciso retirar o prefixo do namespace quando ele envia o XML. O xml é gerado sem prefixos, mas quando ele envia os prefixos aparecem :S
Exemplo:
O XML é enviado assim:
<ns4:tpAmb>2</ns4:tpAmb>
<ns4:nRec>03000000000878</ns4:nRec>
Gostaria de retirar esses prefixos “ns4”, será que isso é possivel ? alguem já passou por isso?
[]s
Se o seu modelo é dependente de namespace, pq vc quer tirar os prefixos??
Por que estou desenvolvendo um sistema parecido com a nota fiscal eletronica… e no manual o web service deles exige isso
Existe alguma forma de fazer isso?
Suponha que o cliente do seu serviço se chame NotaFiscalService
é só vc fazer algo do tipo:
Service service = new NotaFiscalService(new URL("http://qualquerlugar"),
new QName("http://namespace", "nomeDoServico", "prefixo"));
e no lugar do “prefixo” é soh colocar “”
só não pode ter mais de um namespace mapeado pra “”
quando for pegar o Port também dá pra especificar um QName… e é soh colocar
o prefixo vazio tb…
Fiz exatamente o que voce disse e ainda continuo com esse problema
Estou passando um objeto Document como parametro … ser que pode ser isso?
[]
Tenta algo do tipo então:
Document d = ...;
d.setPrefix("");
talvez vc tenha que tirar a passagem de prefixos no QName… mas isso deve funcionar…
Lucas,
Não sei mais o que fazer continua do mesmo jeito!
Da uma olhada no request do WS.
---[HTTP request]---
SOAPAction: ""
Accept: application/soap+xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Type: application/soap+xml;charset="utf-8";action="http://www.portalfiscal.inf.br/cte/wsdl/
CteRetRecepcao/cteRetRecepcao"
<?xml version="1.0" ?><S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Header><cteCabecMsg xmlns="http://www.portalfiscal.inf.br/cte/wsdl/CteRetRecepcao">
<cUF>0</cUF>
<versaoDados>1.00</versaoDados>
</cteCabecMsg>
</S:Header>
<S:Body>
<cteDadosMsg xmlns="http://www.portalfiscal.inf.br/cte/wsdl/CteRetRecepcao">
<consReciCTe:consReciCTe xmlns:consReciCTe="http://www.portalfiscal.inf.br/cte" xmlns=""
xmlns:ns4="http://www.portalfiscal.inf.br/cte" versao="1.00">
<ns4:tpAmb>2</ns4:tpAmb>
<ns4:nRec>03000000000878</ns4:nRec>
</consReciCTe:consReciCTe>
</cteDadosMsg>
</S:Body>
</S:Envelope>
como voce o processo de importação do ws é com o wsimport?
[]
já tem um namespace sem prefixo, o http://www.portalfiscal.inf.br/cte/wsdl/CteRetRecepcao ,
e só pode ter um namespace por prefixo.
qdo tah xmlns=“namespace” quer dizer q o namespace vai ficar sem prefixo
se tiver xmlns:qqer=“namespace” quer dizer q o namespace vai ficar com o prefixo qqer…
de qqer coisa, eu acho q vc vai ter que colocar o xml que vc precisa q esteja sem prefixo
dentro de um CDATA
algo como
<cteDadosMsg xmlns="http://www.portalfiscal.inf.br/cte/wsdl/CteRetRecepcao">
<!CDATA[
<consReciCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="1.00">
<tpAmb>2</tpAmb>
<nRec>03000000000878</nRec>
</consReciCTe>
]!>
</cteDadosMsg>
ou sei lah… vc vai ter que de algum jeito colocar um prefixo no namespace
http://www.portalfiscal.inf.br/cte/wsdl/CteRetRecepcao e tirar o prefixo no namespace
http://www.portalfiscal.inf.br/cte
vc vai poder fazer isso fazendo algo do tipo:
Service service = new NotaFiscalService(new URL("http://qualquerlugar"),
new QName("http://www.portalfiscal.inf.br/cte/wsdl/CteRetRecepcao", "CteRetRecepcao", "nfp"));
NotaFiscalServicePort port = service.getPort(new QName("http://www.portalfiscal.inf.br/cte/wsdl/CteRetRecepcao",
"CteRetRecepcao_Port", "nfp"), NotaFiscalServicePort.class);
Document d = ...;//cria o documento de algum jeito
d.setPrefix("");
port.notaFiscalOperation(d);
me manda o código que vc tah usando pra invocar o webservice
Chamo desse jeito:
CteRetRecepcao service = new CteRetRecepcao(new URL("file:/home/cristiano/CteRetRecepcao.wsdl")
, new QName("http://www.portalfiscal.inf.br/cte/wsdl/CteRetRecepcao", "CteRetRecepcao","cte"));
CteRetRecepcaoSoap12 port = service.getCteRetRecepcaoSoap12();
CteDadosMsg cteDadosMsg = new CteDadosMsg();
Document xml = getDocument();
cteDadosMsg.getContent().add(xml.getDocumentElement());
CteCabecMsg cteCabecMsg = new CteCabecMsg();
cteCabecMsg.setCUF("0");
cteCabecMsg.setVersaoDados("1.00");
Holder<CteCabecMsg> holder = new Holder<CteCabecMsg>(cteCabecMsg);
result = port.cteRetRecepcao(cteDadosMsg, holder);
vc tentou o
xml.setPrefix("");
ou
xml.getDocumentElement().setPrefix("");
??
tenta usar a ferramenta wsimport pra gerar as classes de modelo a partir do wsdl
assim vc não precisa ficar manipulando a árvore DOM, que é bastante feio é suscetivel a erros…
https://jax-ws.dev.java.net/jax-ws-ea3/docs/wsimport.html
se mesmo assim vc precisar trabalhar com árvores DOM dê uma olhada no JAXB
(JAXBFactory, Marshaller, Unmarshaller, ambos trabalham com DOM)
[]'s
E o pior de tudo é que eu usei o wsdlimport e estou trabalhando com objetos !
O problema é que tenho uma lista e tenho que passar um xml no seu conteudo.
Quando passo uma String os caracteres ficam desconfigurados.
Tipo:
<ns1:consReciCTe ns1:versao="1.00" xmlns:ns1="http://www.portalfiscal.inf.br/cte">
<ns1:tpAmb>2</ns1:tpAmb>
<ns1:nRec>03000000000887</ns1:nRec>
</ns1:consReciCTe>
E ai tenho que passar um Document… por isso que da esse erro e eu não consigo mudar o prefix do namespace.
Se eu passar uma string ele vai do jeito que eu quero
Sera que tem como eu passar essa String sem ter esses caracteres malucos?
os caracteres não apareceram eles são o "e comercial " seguidos de lt ou gt
sim… se vc passar um xml por string, ele vai escapar os caracteres reservados para o xml
como o < = < e o > = >
Tem como eu passar string sem escapar esses caracteres?
só se a string estiver dentro de um CDATA…
caso contrario ela seria interpretada como um pedaço de xml…
tentei colocar num e ainda mostra caracteres especiais.
estou quase desistindo disso rsrs
colocar num CDATA não é colocar:
String xml = "<blah></blah>";
xml = "<!CDATA[" + xml + "]>";
é fazer algo como:
Document d;
d.createCDATA(xml);
não lembro como usa, mas é algo do tipo…
[]'s
cinglez
Janeiro 22, 2010, 2:42pm
#20
Pessoal,
tendo o arquivo XML gerado, como passo para o objeto cteDadosMsg? É diferente da NFe, que normalmente tratava tudo como String.
Dá pra fazer isso?
Obrigado