Obrigado por visitar a devmedia.com.br!

Precisamos de você para divulgar nossos vídeos e cursos gratuitos para a comunidade.

Se você gosta da devmedia.com.br por favor dê-nos o seu clique para o Google+ e ajude outros desenvolvedores ao redor do mundo.



Obrigado por seu apoio!
Equipe DevMedia

sair sem compartilhar (x)
DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:

  #Este é um post fechado

Este post está disponível para assinantes da Java Magazine DIGITAL ou para quem possui Créditos DevMedia. Clique aqui para saber mais sobre como abrir este post!



Artigo Java Magazine 71 - Introdução ao Spring Web Services

Entenda as vantagens de começar o desenvolvimento de um web service definindo um contrato para as mensagens XML antes de sua implementação em Java






BRK##: 38 - 37

Introdução ao Spring Web Services

Desenvolva Web services começando pelo contrato

Entenda as vantagens de começar o desenvolvimento de um web service definindo um contrato para as mensagens XML antes de sua implementação em Java

 

Do que se trata o artigo:

O artigo apresenta o estilo de desenvolvimento contract-first para web services utilizando o framework Spring Web Services (Spring-WS). O foco do estilo contract-first são as mensagens XML, deixando o código da linguagem de implementação desacoplado do contrato do serviço.

Para que serve:

Com o Spring-WS é possível construir web services utilizando boas práticas de desenvolvimento, de forma simples e prática. O framework se destaca por não necessitar de geração de código Java no processo de desenvolvimento do cliente ou do servidor.

Em que situação o tema é útil:

O assunto é relevante para web services de médio e grande porte que necessitem manterem-se estáveis ao longo do tempo, garantindo estabilidade e interoperabilidade. Para web services de pequeno porte o desenvolvimento contract-last ainda é mais adequado.

Spring Web Services:

Existem dois estilos diferentes de desenvolvimento de web services: Contract Last e Contract First. O estilo contract-last implica em gerar um WSDL automaticamente a partir do código Java. No estilo contract-first, primeiro cria-se o contrato WSDL, e então, mapeiam-se as mensagens XML para endpoints implementados em Java.

O estilo contract-first apresenta vantagens para web services de médio e grande porte os quais possuem rígidos requisitos para manterem-se constantes ao longo do tempo. O Spring Web Services facilita o desenvolvimento contract-first, focando no desenvolvimento de um XML schema que será utilizado para gerar o contrato WSDL.

O Spring-WS ainda oferece a possibilidade de implementar endpoints nas mais variadas tecnologias de parsing XML. O framework ainda disponibiliza um recurso de interceptors que auxilia na implementação de requisitos não funcionais, como segurança, logging, validação, etc. Por fim, na parte do desenvolvimento de clientes para Web services, o Spring-WS possui um template que permite invocar serviços com simplicidade.

Este artigo será composto por duas partes. Nesta primeira parte apresentaremos uma introdução ao Spring-WS e ao desenvolvimento contract-first. Na próxima parte apresentaremos assuntos mais avançados, como mapeamento Objeto/XML e autenticação com WS-Security.

 

 

 

 

 

 

 

 

 

Existem dois estilos diferentes de desenvolvimento de web services: Contract Last e Contract First. A abordagem mais comum, com a qual o leitor provavelmente já está acostumado, é o desenvolvimento contract-last. Este estilo de desenvolvimento implica em desenvolver código Java, e a partir dele, gerar o contrato (WSDL) automaticamente. Vários frameworks oferecem esta abordagem, dentre eles os mais famosos são o Axis e o CXF (antigo XFire). Já no desenvolvimento contract-first primeiro cria-se o contrato WSDL, e então, usa-se Java para implementá-lo.

Existe uma grande tendência nos desenvolvedores em pensar em web services como sendo a exposição de métodos Java para acesso remoto. Inicialmente, essa era a idéia. Web services eram considerados apenas outra forma de realizar chamada remota de procedimentos (RPC). Porém, com o tempo, descobriu-se que utilizar documentos XML (document-driven) para troca de mensagens entre cliente e servidor é uma grande vantagem, pois aumenta a interoperabilidade e facilita a estruturação e validação dos dados. Dessa forma, podemos dizer que um web service é melhor comparado com uma fila de mensagens (como JMS por exemplo), ao invés de RPC. Além disso, XML é uma representação neutra da informação e independente de plataforma. O foco no desenvolvimento de web services deve ser no XML, e não em código Java.

A princípio, em questão de minutos, é possível utilizar a IDE (ou outra ferramenta) para criar um web service a partir de um método. Essa abordagem funciona, principalmente para pequenos projetos, mas não é a melhor solução quando se trata de sistemas de médio/grande porte. A abordagem contract-first diminui o acoplamento entre o contrato e a implementação, aumenta a interoperabilidade e a facilidade de manutenção. Entretanto, convencer um time de desenvolvimento a utilizar contract-first não é uma tarefa fácil, pois implica em gastar mais tempo em tecnologias como XML schema (XSD) e WSDL, diminuindo o foco no código Java.

O Spring Web Services (Spring-WS) é um subprojeto do Spring Framework com foco em facilitar o desenvolvimento de Web services utilizando o desenvolvimento contract-first. O framework é capaz de gerar um WSDL baseando-se em um XSD, e então, mapear as mensagens para endpoints. O Spring-WS ainda oferece abstrações sobre APIs de parsing XML, suporte a WS-Security e a diferentes protocolos de transporte.

Este artigo será composto por duas partes. Nesta primeira parte apresentaremos uma introdução à plataforma Spring-WS e ao paradigma contract-first. Na próxima parte apresentaremos assuntos mais avançados, como mapeamento Objeto/XML e autenticação com WS-Security.

Para melhor entendimento do artigo é assumido que o leitor possui conhecimentos básicos em tecnologias relacionadas a XML e web services como SOAP, XML schema e WSDL. Para leitores interessados em aprender estes temas, aconselho os excelentes tutoriais elaborados pela W3C disponíveis na seção de links.

Contract-first versus Contract-last

Antes de começarmos o desenvolvimento dos exemplos práticos vamos apresentar algumas razões para escolha de um desenvolvimento contract-first.

Fragilidade

Como já mencionado anteriormente, a abordagem contract-last implica no código Java gerar o contrato do web service (WSDL) automaticamente. Ao utilizar essa abordagem não existe nenhuma garantia que o contrato WSDL vai permanecer constante ao longo do tempo. Qualquer alteração na interface Java pode resultar em uma alteração indesejada no WSDL.

Outra desvantagem é que nem todos os frameworks geram o mesmo WSDL baseado em uma interface Java dificultando a mudança de implementação, por exemplo, migrar uma implementação em Axis para JAX-WS.

Para que um contrato seja bem sucedido ele deve permanecer constante ao longo do tempo, mantendo compatibilidade retroativa com versões antigas. Isso evita avisar clientes de mudanças para que eles tenham que alterar seu código.

Ao utilizar contract-first o contrato permanece em um arquivo XML schema à parte do código Java. Dessa forma, ele só é alterado quando desejado e adicionalmente pode-se utilizar transformações XSLT para garantir que versões antigas continuem funcionando com o novo contrato.



ATENÇÃO! A exibição deste artigo foi interrompida.


  #Este é um post fechado

Este post está disponível para assinantes da Java Magazine DIGITAL ou para quem possui Créditos DevMedia. Clique aqui para saber mais sobre como abrir este post!







    12 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Everton Amaral
Olá brother,

Gostaria de saber se tem como implementar uma class java que leia o wsdl e gere uma inteface ou ".jar" como qldo fazemos com xsd?


em 15/9/2009 09:01 - Responder

 

Everton Amaral
Estou fazendo um cliente mas não quero criar um string hardCode no codigo, mas usar uma class/inteface que faça isso para mim e facilitar se o wsdl por algum motivo mudar durante o projeto..

Obrigado
att


em 15/9/2009 09:03 - Responder

 

[Comentário do autor]   Michel Zanini
Everton,

Nao entendi exatamente sua pergunta. Voce quer externalizar a URL que o cliente necessita para acessar o WSDL? Se for isso basta utilizar um arquivo de propriedades juntamente com o application context. A String pode ser injetada no cliente.

Abracos.


em 15/9/2009 09:12 - Responder
 

  Everton Amaral
No exemplo da revista para a classe cliente vc usou uma string para fazer a comunicação com o WS como eu posso fazer isso sem usar hardCode?
 
public static final String MESSAGE =
"<echo:echoRequest xmlns:echo=\"http://www.javamagazine.com.br/spring-ws/schema/echo\">MensagemTeste</echo:echoRequest>";
    

e uma outra duvida no exemplo a resposta é printada do console como eu posso pegar essa resposta e colocar em uma string?

obrigado
Att


em 15/9/2009 10:12 - Responder
 

[Comentário do autor]   Michel Zanini
Everton,

Para envio da mensagem sera aceito classes que implementam javax.xml.transform.Source (http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/transform/Source.html).

Ou seja, voce pode enviar um objeto DOM ou SAX (DOMSource, SAXSource) ou mesmo um objeto, caso utilizar um framework OXM. Irei explicar melhor isso na segunda parte do artigo.

Para a resposta eh a mesma coisa, porem com implementacoes de javax.xml.transform.Result.

Mais detalhes na documentacao do Spring-WS - http://static.springsource.org/spring-ws/sites/1.5/reference/html/client.html

Abracos.
Michel.




em 15/9/2009 10:55 - Responder
 

Everton Amaral

Michel,


Estou com um problema.

estava usando um cliente para me conectar a um WS criado por mim. iqual a o exemplo chamando a defaultURI.

minha uri de exemplo era: http://{servidor}:{porta}/{contexto}/runnerModel.wsdl

o servidor de verdade que preciso me conectrar tem  chamada http://{servidor}:{porta}/{contexto}/runnerModel?wsdl

quando rodo o cliente ele não consegui resouver o "runnerModel?wsdl" meu cliente lee somente o  "http://{servidor}:{porta}/{contexto}/runnerModel"


tem outra maneira de criar esse cliente? eu estou fazendo certo?


obrigado


att

Everton Amaral



em 21/9/2009 09:09 - Responder

 

  Everton Amaral
O teste com minha uri de exemplo era: http://{servidor}:{porta}/{contexto}/runnerModel.wsdl funciona.

Qndo tento com
http://{servidor}:{porta}/{contexto}/runnerModel?wsdl que da não funciona


em 21/9/2009 10:29 - Responder
 

[Comentário do autor]   Michel Zanini
Everton,

Tenta acessar esta URL pelo seu browser. Verificar se o WSDL esta retornando corretamente. Em seguida utilize exatamente a mesma URL para o defaultUri do cliente (copy paste). Nao deveria dar nenhum problema. Caso ocorrer verifique o stack trace no log e traz aqui para mim dar uma olhada.

Abracos.


em 22/9/2009 15:09 - Responder
 

  Everton Amaral
Michel

Eu estava tendo problemas com minha msg. já resolvi.
O que eu tive dificuldade foi para identificar o erro, nos foruns falavam mto sobre a falta do cabeçalho do SOAPAction achei até que erra isso, mas instalando eu tcpmon.jar para monitorar o que eu estava enviando e recebendo pude identificar meu erro.

eu estava mandando a msg xml SOAP completo assim quando o spring mandava a msg ele encapisulada novamente. por isso o erro.

------

Michel, vc tem algum exemplo diferente do doc do spring-ws que eu pegando o wsdl do servidor e com ele usar para mandar a msg para o servidor?
hoje eu estou fazendo hadeCode com uma string mais isso não esta legal vc pode me ajudar?

Obrigado
att
Everton Amaral



Anexo:
The endpoint reference (EPR) for the Operation not found is http://10.2.1.47:19081/Experto2Bus/services/runnerModel and the WSA Action

Ex. JavaMagazine
MESSAGE = "MensagemTeste";
O que eu Fiz:
MESSAGE =
        ""
       +""
       +""
       +"   "
       +"      teste"
       +"  
"
       +"
"
       +"
";

No teste funciono, mas do serviço real tinha que mandar só:
         ""
       +"      teste"
       +"  
"

abr



em 23/9/2009 10:32 - Responder
 

Everton Amaral
Michel, vc tem algum exemplo diferente do doc do spring-ws que eu pegando o wsdl do servidor e com ele usar para mandar a msg para o servidor?
hoje eu estou fazendo hadeCode com uma string mais isso não esta legal vc pode me ajudar?

Obrigado
att
Everton Amaral


em 23/9/2009 10:35 - Responder

 

[Comentário do autor]   Michel Zanini
Everton,

Como ja lhe disse antes. O exemplo com string da revista foi algo muito simples, so para ilustrar. Voce nao deveria estar fazendo desta forma. O cliente aceita implementacoes da interface javax.xml.transform.Source, se vc quiser utilizar DOM, entao pode utilizar a classe DOMSource.

Veja documentacao no site do Spring-WS.


em 23/9/2009 11:25 - Responder
 

Everton Amaral
Michel,
Eu estou procurando como fazer um servidor meu Ouvir SOAP1.2 tem em algum lugar onde eu possa procurar ou se vc já passou por esse problema, pode me ajudar...

estou tendo esse stakTrace:
SAAJ0533: Cannot create message: incorrect content-type for SOAP version. Got application/soap+xml; charset=UTF-8; action="urn:authenticate", but expected text/xml





em 19/10/2009 17:22 - Responder

 



Autor
Michel Zanini

Formado em Ciências da Computação pela Universidade Federal de Santa Catarina (UFSC) e possui as certificações SCJP, SCWCD, SCBCD e SCDJWS.


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
1   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]
Este post está disponível para assinantes da Java Magazine DIGITAL ou para quem possui Créditos DevMedia.

  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 4,90 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ 1,96 (assinante) ou R$ 2,45 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ 1,47
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03