#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
[Artigo já está disponível no Leitor Digital DevMedia®. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Java Magazine 71
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!

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

Obrigado
att
em 15/9/2009 09:03 - Responder

Michel ZaniniNao 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 Amaralpublic 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

Michel ZaniniPara 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

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 AmaralQndo tento com http://{servidor}:{porta}/{contexto}/runnerModel?wsdl que da não funciona
em 21/9/2009 10:29 - Responder

Michel ZaniniTenta 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 AmaralEu 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 = "
O que eu Fiz:
MESSAGE =
"
+"
+"
+"
+"
+"
+"
+"
No teste funciono, mas do serviço real tinha que mandar só:
"
+"
+"
abr
em 23/9/2009 10:32 - Responder

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

Michel ZaniniComo 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

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
Space do autor

Estudo comparativo entre banco de dados IBM Informix e Microsoft SQL

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