quinta-feira, 19 de junho de 2008

EJB3 + WebService no JBossAS

Venho fazer este post não com o objetivo de falar sobre como criar WebServices a partir de SessionBean na especificação do EJB3.

Venho falar sobre as experiências que eu tive e sobre o que eu apreendi. Todas as experiências que eu tive de EJB3 com WebServices foram dentro do ambiente JBossAS, então muitas das coisas que eu vou falar são expecíficas no JBossAS.

Então antes de começar a implementar vamos configurar o JBossAS. O JBossAS trabalha com componentes, no caso, ele tem um componente que trata da parte de WebService, o JBossWS. Uma vantagem nesta forma de trabalhar é que podemos alterar a forma que ele é implementado, colocando o framework que preferirmos, e atualizando a sua versão sem precisar atualizar o AS inteiro. As opções de implementações que a equipe do JBoss mantém são: Native (Axis), Metro e CXF.

Recomendo atualizar a versão do componente, por exemplo colocando a versão 2.0.4 do Native.

Falo isso pois ao atualizar a versão você terá duas vantagem:
  1. Criação de vários EndPointer (WebServices) cada um com seu ContextPath. Acabando com o problema de vários EndPointer para mesmo ContextPath.
  2. Utilização de tipos complexos com Coleções (Collection, List e Set), em versões anteriores só era permitido array de objetos.
Outra coisa interessante no JBossAS é o serviço UDDI que já vem na versão 4.0.2. Ele usa o jUDDI para isso. Para configurar entre no wiki: JUDDIConfiguration.

Recomendo a leitura do Wiki do JBossWS, mantido pelo pessoal do JBoss.

Falando agora da parte de implementação...

Prefiro não colocar aqui código fonte de exemplo, mas sim algumas praticas que eu acho interessantes.
  1. Não expor todos os métodos a não ser que eles sejam de fatos usados;
  2. Evitar passar como parâmetro objetos complexos onde serão usados um ou dois atributos destes;
  3. Evitar passar como parâmetro informações que podem ser obtidas de outras formas, por exemplo: O usuário do serviço, este pode ser obtido a partir do WebServiceContext;
  4. Verificar sempre se o usuário conectado pode ter acesso aos objetos a serem manipulados, por exemplo: em um sistema ASP onde várias empresas têm cadastros com vários usuários e vários clientes, então um usuário logado no sistema pede para ver os dados de um cliente cujo ID é passado como parâmetro. Devesse verificar se o cliente está no "banco de dados" da empresa do usuário logado;
  5. Utilize o recurso de Exception, isso ajuda a não utilizar o retorno como verificação da execução do método.
Uma dica sobre teste em WebServices recomendo a ferramenta: soapUI. Ela é bem interessante, podendo ser usada dentro do Eclipse, Netbeans entre outros.

Bom é isso, irei colocar nos próximos post outras experiências minhas.