6 Replies Latest reply on Jan 15, 2013 11:48 AM by leandropantoja

    How to change xml prefix on response (bean service)

    leandropantoja

      Hi,

       

       

      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.