Expondo Session Beans via WebServices no NetBeans

Este blog deixou de ser mantido, mas o autor continua escrevendo aqui. Não deixe de assinar o novo feed!

Já utilizo o NetBeans a um bom tempo, mas descobri hoje uma feature que eu não conhecia. Trata-se de algo bastante simples - meio ridículo até - mas útil para aqueles que gostam de evitar a fadiga de se digitar desnecessariamente.

Suponha que você tenha um projeto de módulo EJB com um Stateless Session Bean utilizado para efetuar a operação de soma de dois inteiros:

Calculator - business interface:

  1.  
  2. package com.danielfmartins.ejb;
  3.  
  4. public interface Calculator {
  5.     int add(int a, int b);
  6. }
  7.  

CalculatorBean:

  1.  
  2. package com.danielfmartins.ejb;
  3.  
  4. // imports…
  5.  
  6. @Stateless
  7. @Remote(Calculator.class)
  8. public class CalculatorBean implements Calculator {
  9.    
  10.     public int add(int a, int b) {
  11.         return a + b;
  12.     }
  13. }
  14.  

Considere este código apenas para fins de demonstração. Bom, vamos supor que, em razão de algumas mudanças no negócio, você precise expor este Session Bean através de um WebService.

Com a nova especificação do EJB - e com o NetBeans, lógico - isso é algo muito simples de se fazer. Durante a criação de um novo WebService, no NetBeans, temos uma opção que permite que o novo WebService funcione como um delegate para um EJB já existente. Na imagem abaixo, indicamos que o WebService deverá utilizar o Stateless Session Bean Calculator:

ws01.png

Finalizando o assistente, uma nova classe @Stateless @WebService é criada contendo uma referência ao EJB indicado:

  1.  
  2. package com.danielfmartins.ws;
  3.  
  4. // imports…
  5.  
  6. @Stateless
  7. @WebService
  8. public class CalculatorWSBean {
  9.    
  10.     // Add business logic below. (Right-click in editor and choose
  11.     // "EJB Methods > Add Business Method" or "Web Service > Add Operation")
  12.     @EJB
  13.     private Calculator calculatorBean;
  14. }
  15.  

Então, para adicionar métodos de negócio ao WebService, basta fazer exatamente como indica o comentário: clique com o botão direito no editor e escolha a opção Web Service - Add Operation:

ws02.png

Nesta imagem, indicamos a criação de um método add(), com informações sobre os parâmetros e tipo de retorno. O resultado:

  1.  
  2. package com.danielfmartins.ws;
  3.  
  4. // imports…
  5.  
  6. @Stateless
  7. @WebService
  8. public class CalculatorWSBean {
  9.    
  10.     @EJB
  11.     private Calculator calculatorBean;
  12.  
  13.     /**
  14.      * Web service operation
  15.      */
  16.     @WebMethod
  17.     public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b) {
  18.         // TODO implement operation
  19.         return 0;
  20.     }
  21. }
  22.  

Com isso feito, basta delegar a chamada ao seu EJB:

  1.  
  2. package com.danielfmartins.ws;
  3.  
  4. // imports…
  5.  
  6. @Stateless @WebService
  7. public class CalculatorWSBean {
  8.    
  9.     @EJB
  10.     private Calculator calculatorBean;
  11.    
  12.     @WebMethod
  13.     public int add(@WebParam(name = "a") int a, @WebParam(name = "b") int b) {
  14.         return calculatorBean.add(a, b);
  15.     }
  16. }
  17.  

Para ver se está tudo funcionando, faça o deploy e teste o WebService:

ws03.png

ws04.png

Cuidado!

15612924_be0d9a3470_m.jpgNinguém pode negar que a “nova” versão da especificação EJB torna as coisas mais simples de serem feitas. As poucas linhas de código (e nenhuma de XML) usadas para implementar o Session Beans e o WebServices servem para provar esta afirmação. No entanto, a nova facilidade que vemos no EJB não muda o fato de que, para se criar aplicações decentes, devemos “suar a camisa” e estudar.

Falando um pouco mais sobre o código mostrado neste post, apesar de se tratar de um recurso interessante, temos que tomar algum cuidado para não comprometermos a performance da aplicação através do aumento da carga na rede e serialização/de-serialização de objetos. Portanto, sempre que possível, declare o bean como @Local e implante o WebService dentro do mesmo EJB-JAR no qual o bean está inserido. É claro que, caso esta abordagem não seja possível de ser utilizada (o bean deve ser mantido como @Remote, por exemplo), outras medidas podem ser tomadas de modo a melhorar a performance da aplicação… mas não falarei sobre isso. Pelo menos, não hoje. :D

Foto por: e53.

Tags: , , , ,