How to change xml prefix on response (bean service)
leandropantoja Jan 15, 2013 7:43 AMHi,
I have defined a WSDL look like this:
<?xml version="1.0" encoding="UTF-8" ?>
<wsdl:definitions
name="Pessoa"
targetNamespace="http://www.grupomult.com.br/soa/switchyard/PessoaFisica/wsdl"
xmlns="http://www.grupomult.com.br/soa/switchyard/PessoaFisica/wsdl"
xmlns:p="http://www.grupomult.com.br/soa/switchyard/PessoaFisica/xsd"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:types>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.grupomult.com.br/soa/switchyard/PessoaFisica/xsd"
targetNamespace="http://www.grupomult.com.br/soa/switchyard/PessoaFisica/xsd"
elementFormDefault="qualified">
<xsd:element name="obterDadosPessoaFisicaRequest" type="ObterDadosPessoaFisica"/>
<xsd:complexType name="ObterDadosPessoaFisica">
<xsd:sequence>
<xsd:element name="documentoFiscal" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="obterDadosPessoaFisicaResponse" type="PessoaFisica"/>
<xsd:complexType name="PessoaFisica">
<xsd:sequence>
<xsd:element name="documentoFiscal" type="xsd:string"/>
<xsd:element name="nome" type="xsd:string"/>
<xsd:element name="tipoPessoa" type="xsd:string"/>
<xsd:element name="endereco" type="Endereco"/>
<xsd:element name="dadosBancarios" type="DadosBancarios"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Endereco">
<xsd:sequence>
<xsd:element name="logradouro" type="xsd:string"/>
<xsd:element name="cep" type="xsd:string"/>
<xsd:element name="complemento" type="xsd:string"/>
<xsd:element name="cidade" type="xsd:string"/>
<xsd:element name="estado" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="DadosBancarios">
<xsd:sequence>
<xsd:element name="banco" type="xsd:int"/>
<xsd:element name="conta" type="xsd:string"/>
<xsd:element name="agencia" type="xsd:string"/>
<xsd:element name="tipoConta" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
</wsdl:types>
<wsdl:message name="obterDadosPessoaFisicaRequestMessage">
<wsdl:part name="request" element="p:obterDadosPessoaFisicaRequest"/>
</wsdl:message>
<wsdl:message name="obterDadosPessoaFisicaResponseMessage">
<wsdl:part name="response" element="p:obterDadosPessoaFisicaResponse"/>
</wsdl:message>
<wsdl:portType name="PessoaFisica_ptt">
<wsdl:operation name="obterDadosPessoaFisica">
<wsdl:input message="obterDadosPessoaFisicaRequestMessage"/>
<wsdl:output message="obterDadosPessoaFisicaResponseMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="PessoaFisica_pttBinding" type="PessoaFisica_ptt">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="obterDadosPessoaFisica">
<soap:operation style="document" soapAction="obterDadosPessoaFisica"/>
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="PessoaFisica">
<wsdl:port name="PessoaFisica_pt" binding="PessoaFisica_pttBinding">
<soap:address location="http://localhost:18001/test"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Based on WSDL, I'v create a service and a Bean (similar to quickstart bean-service).
The SOAP request is:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.grupomult.com.br/soa/switchyard/PessoaFisica/xsd">
<soapenv:Header/>
<soapenv:Body>
<xsd:obterDadosPessoaFisicaRequest>
<xsd:documentoFiscal>80386466220</xsd:documentoFiscal>
</xsd:obterDadosPessoaFisicaRequest>
</soapenv:Body>
</soapenv:Envelope>
The tranformation File beetwen XML request to Java Bean and Java bean to XML response is here:
@Transformer(from = "{http://www.grupomult.com.br/soa/switchyard/PessoaFisica/xsd}obterDadosPessoaFisicaRequest")
public String transformObterDadosPessoaFisicaRequestToString(Element from) {
String documentoFiscal = this.getElementValue(from, "xsd:documentoFiscal");
return documentoFiscal;
}
@Transformer(to = "{http://www.grupomult.com.br/soa/switchyard/PessoaFisica/xsd}obterDadosPessoaFisicaResponse")
public Element transformPessoaFisicaToObterDadosPessoaFisicaResponse(
PessoaFisica from) {
StringBuffer pessoaXml = new StringBuffer();
pessoaXml.append("<obterDadosPessoaFisicaResponse>");
pessoaXml.append("<documentoFiscal>" + from.getDocumentoFiscal() + "</documentoFiscal>");
pessoaXml.append("<nome>" + from.getNome() + "</nome>");
pessoaXml.append("<tipoPessoa>Pessoa Física</tipoPessoa>");
pessoaXml.append("<endereco>");
pessoaXml.append("<logradouro>" + from.getEndereco().getLogradouro() + "</logradouro>");
pessoaXml.append("<cep>" + from.getEndereco().getCep() + "</cep>");
pessoaXml.append("<complemento>" + from.getEndereco().getComplemento() + "</complemento>");
pessoaXml.append("<cidade>" + from.getEndereco().getCidade() + "</cidade>");
pessoaXml.append("<estado>" + from.getEndereco().getEstado() + "</estado>");
pessoaXml.append("</endereco>");
pessoaXml.append("<dadosBancarios>");
pessoaXml.append("<banco>" + from.getDadosBancarios().getBanco() + "</banco>");
pessoaXml.append("<conta>" + from.getDadosBancarios().getConta() + "</conta>");
pessoaXml.append("<agencia>" + from.getDadosBancarios().getAgencia() + "</agencia>");
pessoaXml.append("<tipoConta>" + from.getDadosBancarios().getTipoConta() + "</tipoConta>");
pessoaXml.append("</dadosBancarios>");
pessoaXml.append("</obterDadosPessoaFisicaResponse>");
return this.toElement(pessoaXml.toString());
}
private String getElementValue(Element parent, String elementName) {
String value = null;
NodeList nodes = parent.getElementsByTagName(elementName);
if (nodes.getLength() > 0) {
value = nodes.item(0).getChildNodes().item(0).getNodeValue();
}
return value;
}
private Element toElement(String xml) {
DOMResult dom = new DOMResult();
try {
TransformerFactory.newInstance().newTransformer().transform(new StreamSource(new StringReader(xml)), dom);
} catch (Exception ex) {
ex.printStackTrace();
}
return ((Document)dom.getNode()).getDocumentElement();
}
When I run my service, the response is:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<obterDadosPessoaFisicaResponse>
<documentoFiscal>4536384959</documentoFiscal>
<nome>Leandro Pantoja Pereira</nome>
<tipoPessoa>Pessoa Física</tipoPessoa>
<endereco>
<logradouro>Adress Data</logradouro>
<cep>300595-59</cep>
<complemento>apto. 402</complemento>
<cidade>Belo Horizonte</cidade>
<estado>Minas Gerais</estado>
</endereco>
<dadosBancarios>
<banco>3</banco>
<conta>663748-8</conta>
<agencia>3056</agencia>
<tipoConta>Conta Corrente</tipoConta>
</dadosBancarios>
</obterDadosPessoaFisicaResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
I woudl like the response has "<xsd:"prefix.
If I change tranformation file code to this:
pessoaXml.append("<xsd:obterDadosPessoaFisicaResponse>");
pessoaXml.append("<xsd:documentoFiscal>" + from.getDocumentoFiscal() + "</xsd:documentoFiscal>");
pessoaXml.append("<xsd:nome>" + from.getNome() + "</xsd:nome>");
pessoaXml.append("<xsd:tipoPessoa>Pessoa Física</xsd:tipoPessoa>");
pessoaXml.append("<xsd:endereco>");
pessoaXml.append("<xsd:logradouro>" + from.getEndereco().getLogradouro() + "</xsd:logradouro>");
pessoaXml.append("<xsd:cep>" + from.getEndereco().getCep() + "</xsd:cep>");
pessoaXml.append("<xsd:complemento>" + from.getEndereco().getComplemento() + "</xsd:complemento>");
pessoaXml.append("<xsd:cidade>" + from.getEndereco().getCidade() + "</xsd:cidade>");
pessoaXml.append("<xsd:estado>" + from.getEndereco().getEstado() + "</xsd:estado>");
pessoaXml.append("</xsd:endereco>");
pessoaXml.append("<xsd:dadosBancarios>");
pessoaXml.append("<xsd:banco>" + from.getDadosBancarios().getBanco() + "</xsd:banco>");
pessoaXml.append("<xsd:conta>" + from.getDadosBancarios().getConta() + "</xsd:conta>");
pessoaXml.append("<xsd:agencia>" + from.getDadosBancarios().getAgencia() + "</xsd:agencia>");
pessoaXml.append("<xsd:tipoConta>" + from.getDadosBancarios().getTipoConta() + "</xsd:tipoConta>");
pessoaXml.append("</xsd:dadosBancarios>");
pessoaXml.append("</xsd:obterDadosPessoaFisicaResponse>");
A error occours:
(http-localhost-127.0.0.1-8080-1) [Fatal Error] :1:37: The prefix "xsd" for element "xsd:obterDadosPessoaFisicaResponse" is not bound.
10:37:53,828 ERROR [stderr] (http-localhost-127.0.0.1-8080-1) ERRO: 'The prefix "xsd" for element "xsd:obterDadosPessoaFisicaResponse" is not bound.'
10:37:53,830 ERROR [stderr] (http-localhost-127.0.0.1-8080-1) javax.xml.transform.TransformerException: org.xml.sax.SAXParseException: The prefix "xsd" for element "xsd:obterDadosPessoaFisicaResponse" is not bound.
Thanks and sorry about my English
Leandro.