Criando um WebService com a JSR 181

Postado em 17. ago, 2006 por em Java

O Paulo colocou um capítulo de webservices no curso de EJB, com o intuito de aumentar a abrangência do curso em relação as novidades do Java EE 5 e aos poucos diminuir a pesada carga da 1.4, conforme o mercado assimila mais a nova versão.

Fui ver então como ele podia inserir um tema que tem tantos detalhes e conceitos em um curso que já era pesado. Ele está usando a JSR 181, que define anotações para a criação de um webservice para qualquer bean que você deseje deixar acessível. Fiquei muito impressionado com a simplicidade. Vamos direto ao código:

@WebService
public class AgenteDeReservaBean {
  @WebMethod
    public boolean reserva(@WebParam(name = "nome") String nome,
                                         @WebParam(name = "voo") String voo) {

    // acesso ao EntityManager injetado
    // logica de negocios, ou delegacao para o BO
    return false
  }
}

@WebParam é opcional, mas como o bytecode do java 5 não retém os nomes dos parâmetros (em outras palavras, por reflection você não obtém essa informação), o WSDL gerado iria gerar nomes automáticos para os parâmetros (arg0, arg1, etc).

Como ativar esse webservice? XMLs gigantes de configuração? Não! Basta um container que já faz tudo isso para você.

Existem algumas opções de implementações da JSR-181. O pessoal do GUJ gosta do XFire, mas como ele não é um container Java EE 5, você precisa fazer algumas configurações (tais como o web.xml e um outro xml dele próprio) para realizar o deploy.

O JBossWS é uma opção extremamente simples: anote sua classe com @Stateless, instale o JBoss 4.0.x com suporte a ejb3, ligue-o, gere o viagens.jar com essa única classe, deploy, e acesse:

http://localhost:8080/viagens/AgenteDeReserva?wsdl

Seu webservice já está respondendo nesse memo endereço (sem o ?wsdl no final, claro). Um monte de defaults foram usados (nome do serviço, das operações, do resultado, complex types, etc), você poderia configurar tudo isso através das anotações.

Você ainda pode gerar a interface do endpoint necessária através do wstools que acompanha o jboss. Uma maneira extramamente mais simples é já criar um endpoint, definindo essa interface como @WebService, e no seu bean você pode indicar que essa interface é o seu endpoint, evitando assim a geração de código java.

É, e você pensava que o Apache Axis te ajudava bastante para criar um webservice...

Tags: , , , , ,

14 Respostas para “Criando um WebService com a JSR 181”

  1. Carlos Villela

    17. ago, 2006

    Lindo, mas publicar um metodo na web eh relativamente so uma pequena parte do problema. Manter esse metodo seguro, estavel, escalavel, aguentar multiplas versoes do sistema, parametros opcionais… a simplicidade de um @WebMethod eh joia, mas esconde um monte de perigos que a maioria prefere fingir que nao existe.

    Depois, SOAP eh nojento :)

  2. Paulo Silveira

    17. ago, 2006

    É. Se explor um método em uma interface já é uma decisão difícil, expor um método por SOAP é mais ainda… e depois não vai ter @Deprecated pra ajudar, vai ser o pessoal reclamando e vários 404.

    Também prefiro chamadas remotas via XML sem estar envelopado no SOAP: crio meu schema e aviso os clientes. A vantagem do SOAP é a quantidade de ferramentas para gerar os stubs dado o WSDL.

  3. Carlos Villela

    20. ago, 2006

    Qual o problema com REST? :)

  4. Paulo Silveira

    21. ago, 2006

    nada! você também pode usar as anotações!
    http://java.sun.com/developer/technicalArticles/WebServices/restful/

  5. Paulo Silveira

    15. dez, 2007

    Pra ser mais fácil ainda, há uma maneira de você publicar o serviço pelo Java SE, que se encarrega de rodar um servidor web super simples:

    http://weblogs.java.net/blog/jitu/archive/2006/01/web_service_end.html

  6. Andre

    24. out, 2010

    Olá,
    muito interessante.
    E como eu posso colocar uma API no WS e referenciá-la no XML build?

    att,

    André.

Trackbacks/Pingbacks

  1. blog.caelum.com.br » WebServices com o XFire - março 25, 2007

    [...] Nessa segunda feira o Fábio Kung estava me contando de algumas vantagens que enxergava no XFire para criar webservices, e eu logo comentei que preferia o JBossWS porque bastava eu colocar um jar no diretório de deploy, conforme já blogamos anteriormente. [...]

  2. » WebServices sem servidor de aplicação no java 6 » blog.caelum.com.br - julho 11, 2007

    [...] Pronto, fazendo deploy dessa classe no servidor do aplicação cria automaticamente o WebService e disponibiliza o WSDL. Aqui tem uma discussão mais ampla sobre webservices em um servidor de aplicação. [...]

  3. » Java 6, as APIs de XML, Webservices e classloaders » blog.caelum.com.br - dezembro 17, 2007

    [...] consumo de webservices. Aliada a especificação de metadados para webservices (pacote javax.jws), previamente já vista aqui no blog, a JAX-WS tornasse poderosa e fácil de [...]

  4. » Os 7 hábitos dos desenvolvedores de WebServices altamente eficazes » blog.caelum.com.br - fevereiro 18, 2008

    [...] sem que você nem mesmo precise ve-lo um dia. Se você está usando um servidor de aplicação, esta tarefa é ainda mais fácil, até mesmo para fazer o deploy do [...]

  5. Annotations e XFire um jeito simples de criar Web Services | Luciano Silva - agosto 16, 2008

    [...] gradativamente. Pesquisando sobre conceitos e maneiras práticas para desenvolvimento encontrei no Blog dos Desenvolvedores da Caelum a criação de Web Services com a especificação JSR-181 e JSR-224, achei interessantíssimo e [...]

  6. WebServices com o XFire | blog.caelum.com.br - janeiro 20, 2011

    [...] Nessa segunda feira o Fábio Kung estava me contando de algumas vantagens que enxergava no XFire para criar webservices, e eu logo comentei que preferia o JBossWS porque bastava eu colocar um jar no diretório de deploy, conforme já blogamos anteriormente. [...]

  7. WebServices sem servidor de aplicação no java 6 | blog.caelum.com.br - janeiro 21, 2011

    [...] Pronto, fazendo deploy dessa classe no servidor do aplicação cria automaticamente o WebService e disponibiliza o WSDL. Aqui tem uma discussão mais ampla sobre webservices em um servidor de aplicação. [...]

  8. Java 6, as APIs de XML, Webservices e classloaders | blog.caelum.com.br - janeiro 28, 2011

    [...] consumo de webservices. Aliada a especificação de metadados para webservices (pacote javax.jws), previamente já vista aqui no blog, a JAX-WS tornasse poderosa e fácil de [...]

Deixar uma Resposta