Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Qual a diferêça entre @WebMethod e @RequestWrapper

Se eu anotar meu método com @WebMethod(operationName="todosOsItens"), quando eu for consumir o serviço, o nome todosOsItens será usado, se eu colocar no mesmo método @RequestWrapper(localName="listaItens"), o listaItens da segunda notação vai passar a ser o nome usado para se consumir o serviço, sobrescrevendo a primeira notação.

Se os dois fazem a mesma coisa, por que tem os dois? Qual a diferença entre eles?

2 respostas
solução!

Fala aí Douglas blz?

Para entender melhor o porque de ter essas duas anotações que "Fazem a mesma coisa", precisamos entender os estilos de mensagens.

Antigamente era muito utilizado o estilo RPC (Remote Procedure Call) onde tínhamos realmente uma operação (método) no corpo da mensagem SOAP. Nessa época o estilo de mensagem RPC mandava no corpo da mensagem o tipo de dados. (O que foi chamado de encoded e se padronizou como RPC Encoded) Ex.:

<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body xmlns:m="http://www.caelum.com.br/pedido">
<m:salvarPedido><!--Operação/Método-->
      <m:pedido>
        <!--Tipos sendo enviados no corpo-->
            <m:codigo type="xs:int">1742</m:codigo>
            <m:valor type="xs:decimal">319.12</m:valor>
            <m:data type="xs:date">01/12/2015</m:data>
      </m:pedido>

</m:salvarPedido>
</soap:Body>

</soap:Envelope>

Porém isso gerava muita incompatibilidade entre plataformas além do fato de expor muitos detalhes do seu serviço. Com isso surgiu um novo estilo chamado de Document onde no corpo da minha mensagem não é necessário enviar a operação e para resolver o problema com os tipos surgiu o Literal (dessa forma não precisamos mais enviar os tipos no corpo da mensagem, pois eles são definidos a parte dentro ou anexado ao WSDL).

Exemplo:

<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.caelum.com.br/pedido">
  <m:pedido>
    <m:codigo>1742</m:codigo>
    <m:valor>319.12</m:valor>
    <m:data>01/12/2015</m:data>
  </m:pedido>
</soap:Body>

</soap:Envelope>

Esse estilo ficou conhecido como Document Literal nele só enviamos dados.

Mas isso poderia gerar conflitos se eu tivesse duas operações (Salvar, Atualizar por exemplo) que recebessem (no nosso caso) Pedido.

E aí que entra um outro padrão criado que foi o Document/Literal Wrapped, que nada mais é do que um Document/Literal onde podemos envolver o corpo da mensagem em alguma coisa que simbolize a operação.

Exemplo:

<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:m="http://www.caelum.com.br/pedido">
<m:salvar>
  <m:pedido>
    <m:codigo>1742</m:codigo>
    <m:valor>319.12</m:valor>
    <m:data>01/12/2015</m:data>
  </m:pedido>
</m:salvar>
</soap:Body>
</soap:Envelope>

Agora sim podemos falar da diferença entre elas (Ufa! kk)

A anotação @WebMethod foi criada para resolver problemas de customizações quando havia somente RPC/Encoded.

E a anotação @RequestWrapped foi criada com a finalidade de resolver problema de customização quando utilizamos Document/Literal Wrapped.

Espero ter ajudado!

É isso mesmo Fernando, está correto, assisti as outras aulas do treinamento de SOAP e foi falado sobre o RCP e Document. A explicação da aula junto com sua resposta me ajudaram a entender. Muito obrigado