software‎ > ‎módulos‎ > ‎engine‎ > ‎perguntas frequentes‎ > ‎

Como fazer para criar e publicar WebServices?

postado em 31 de mar de 2011 12:52 por Usuário desconhecido   [ 31 de mar de 2011 13:03 atualizado‎(s)‎ ]
A partir da versão 9.1.0.3 do iEngine já é possível criar e publicar WebServices. A publicação é toda feita em java, enquanto que a implementação da regra de negócio é feita em iJavaScript  no iEngine. A comunição entre o ambiente Java e o ambiente iJavaScript é feita através do protocolo HTTP. Antes de iniciar a leitura do passo-à-passo, recomendamos a leitura do artigo Como fazer para executar codigo Java no iEngine?. Segue abaixo o passo-à-passo que demonstra uma construção de um serviço:

Requisitos

Java SE Development Kit (JDK) 6 (http://java.sun.com/javase/downloads/index.jsp)
Eclipse Web Tools Platform - WTP (http://download.eclipse.org/webtools/downloads/)
Apache CXF 2.1.3 (Libs disponíveis na iVFS) (http://cxf.apache.org/download.html)
JSON-Lib 2.2.2-jdk15 (Libs disponíveis na iVFS) (http://json-lib.sourceforge.net/)

Passo-à-Passo

Iremos implementar um serviço de consulta por CPF, ao informar o CPF para o serviço será retornado um JSON com os dados da pessoa consultada.
  1. Primeiramente criaremos a regra de negócio do WebService em um script iJavaScript:

    /**
     * Realiza um pesquisa por Entidade através do CPF e retorna os dados da Entidade Encontrada
     */

    //Tratamento para transformar o tipo Date em JSON deserializável pela JSON-Lib
    Date.prototype.toJson = function Date_toJson() {
       var json = '{
          "date": ' + this.getDate() + ',
          "day": ' + this.getDay() + ',
          "hours": ' + this.getHours() + ',
          "minutes": ' + this.getMinutes() + ',
          "month": ' + this.getMonth() + ',
          "seconds": ' + this.getSeconds() + ',
          "time": ' + this.getTime() + ',
          "timezoneOffset" : ' + this.getTimezoneOffset() + ',
          "year" : ' + this.getYear() + '
       }'
       return json
    }

    function execute() {
      var cpf = javaRequest.getParameter( "cpf" )
      var ds = connection.getDataSet(
          "Select
             NOME,
             NASCIMENTO,
             FONE,
             ENDERECO
          from
             ENTIDADE
          Where CGCCPF = '"+ cpf +"'"
       )

       var nascimento = !!ds.nascimento?ds.nascimento.toJson():"{}"

       var jsonEntidade = '{
          "nome" : "' + ds.nome + '",
          "nascimento": ' + nascimento + ',
          "fone": "' + ds.fone + '",
          "endereco": "' + ds.endereco + '"
       }'

       return jsonEntidade
    }

    execute()


    Note que foi adicionado um método chamado toJson() no protótipo Date(). Este método gera um JSON compatível com a classe java.lang.Date.


  2. Agora teremos que publicar o WebService, a publicação é feita em Java. Vamos lá: Crie um novo projeto do Eclipse(detalhes em: Como fazer para executar codigo Java no iEngine?) chamado MyService e adicione as seguintes javalibs no build path:
    1. commons-logging-1.1.1.jar
    2. cxf-2.1.3.jar
    3. geronimo-activation_1.1_spec-1.0.2.jar
    4. geronimo-annotation_1.0_spec-1.1.1.jar
    5. geronimo-javamail_1.4_spec-1.3.jar
    6. geronimo-servlet_2.5_spec-1.2.jar
    7. geronimo-ws-metadata_2.0_spec-1.1.2.jar
    8. jaxb-api-2.1.jar
    9. jaxb-impl-2.1.7.jar
    10. jaxws-api-2.1.jar
    11. jetty-6.1.9.jar
    12. jetty-util-6.1.9.jar
    13. neethi-2.0.4.jar
    14. saaj-api-1.3.jar
    15. saaj-impl-1.3.2.jar
    16. wsdl4j-1.6.2.jar
    17. wstx-asl-3.2.6.jar
    18. stax-api-1.0.1.jar
    19. xml-resolver-1.2.jar
    20. XmlSchema-1.4.2.jar
    21. enginelet-2.0.jar
    22. commons-beanutils.jar
    23. commons-beanutils-bean-collections.jar
    24. commons-beanutils-core.jar
    25. commons-collections-3.2.jar
    26. commons-lang-2.3.jar
    27. commons-logging-adapters-1.1.1.jar
    28. commons-logging-api-1.1.1.jar
    29. ezmorph-1.0.4.jar
    30. json-lib-2.2.2-jdk15.jar

      PS: As javalibs poderam ser obtidas a partir da iVFS. O artigo Como fazer para executar codigo Java no iEngine? mostra como obter elas no primeiro item do passo-à-passo.
  3. Selecione a pasta de src do projeto e crie um novo pacote. Vá em File/New/Package..., informe o nome "br.com.unum.engine.webservice.teste" para o pacote e clique no botão Finish.
  4. Selecione o pacote criado e cria um crie um classe chamada Entidade.
  5. Implemente a classe Entidade da seguinte forma:

    package br.com.unum.engine.webservice.teste;

    import java.util.Date;

    public class Entidade {
        private String nome;
        private Date nascimento;
        private String fone;
        private String endereco;
        
        public void setNome(String nome) {
            this.nome = nome;
        }
        
        public String getNome() {
            return nome;
        }
        
        public void setNascimento(Date nascimento) {
            this.nascimento = nascimento;
        }
        
        public Date getNascimento() {
            return nascimento;
        }
        
        public void setFone(String fone) {
            this.fone = fone;
        }
        
        public String getFone() {
            return fone;
        }
        
        public void setEndereco(String endereco) {
            this.endereco = endereco;
        }
        
        public String getEndereco() {
            return endereco;
        }
    }

    DICA: O Eclipse ajuda a implementar os métodos get's e set's. Basta digitar get e teclar CTRL+Espaço para auto-completar.
    Este JavaBean será utilizada na deserialização do JSON retornado pelo script da regra de negócio.

  6. Crie uma interface chamada MyService. Vá em File/New/Interface..., informe o nome MyService para a interface e clique no botão Finish.
  7. Codifique a interface da seguinte maneira:

    package br.com.unum.engine.webservice.teste;

    import javax.jws.WebParam;
    import javax.jws.WebService;

    @WebService
    public interface MyService {
        public String obterEntidadePorCPF( @WebParam(name="cpf") String cpf );
    }


    As anotações @WebServie e @WebParam são fundamentais para a publicação do WebService. A anotação @WebService indica que a interface é um WebService e a anotação @WebParam serve para informar o nome do parametro para o gerador do WSDL.

  8. Crie um classe chamada MyServiceImpl que implemente a interface MyService.
  9. Codifique a classe MyServiceImpl da seguite forma:

    package br.com.unum.engine.webservice.teste;

    import java.util.HashMap;
    import javax.jws.WebService;
    import br.com.inteq.engine.ieji.IEngineJavaInterface;
    import net.sf.json.JSONObject;

    @WebService(endpointInterface="br.com.unum.engine.webservice.teste.MyService", serviceName="MyService")
    public class MyServiceImpl implements MyService {

        public Entidade obterEntidadePorCPF(String cpf) {
            try {
                Entidade entidade;
                HashMap<String, String> parametes = new HashMap<String, String>();
                parametes.put("cpf", cpf);
                String entidadeJson = IEngineJavaInterface.runScript(<Chave do script javascript do passo 1>, parametes);

                JSONObject entidadeJsonObj = JSONObject.fromObject(entidadeJson);
                entidade = (Entidade)JSONObject.toBean(entidadeJsonObj, Entidade.class);
                return entidade;
            } catch (RunScriptException e) {
                e.printStackTrace();
                return null;
            }
        }
    }


    Tudo que o método obterEntidadePorCPF faz é executar o script que contém a regra de negócio no iEngine, e o JSON retornado pelo script é deserializado pelo biblioteca json-lib na JavaBean Entidade.
    A anotação @WebService, serve para indicar qual a interface do serviço e o nome do serviço que irá ser publicado no WSDL.

  10. Gere o JAR do WebService. O artigo Como fazer para executar codigo Java no iEngine? mostra com gerar arquivos JAR usando o ANT no Eclipse;
  11. Agora copie o JAR gerado para a pasta <Diretório do iEngine>\javalibs, se você não importou o JAR para a iVFS você deve usar criar o arquivo .ignoresync;
  12. Agora você deve publicar o serviço no JavaServer. JavaServer e o servidor HTTP Java integrado ao iEngine que publica Web Services. Há três formas de publicar Web Services:
    1. Atráves do processo Ir Para\Desenvolvimento\Web Services\Web Services Publicados: Sigua as instruções de ajuda do processo.
    2. Através do código javascript usando a API JavaServer(recomendavél usar durante o desenvolvimento):
      • Use javaServer.publishService( serviceUrl, serviceJavaClass ) para publicar um Web Service. Ex: javaServer.publishService( "http://127.0.0.1:8081/myservice", "br.com.unum.engine.webservice.teste.MyServiceImpl" ). Note que a classe java que deve ser usada é a classe que implementa a interface do serviço.
      • Use javaServer.unpublishService( serviceUrl ) para despublicar um Web Service. Ex.: javaServer.unpublishService( "http://127.0.0.1:8081/myservice" )
      • Use javaServer.listServices() para listar os Web Services publicados.
    3. Através da auto-inicialização de Web Services Ir Para\Desenvolvimento\Web Services\Auto inicialização de Web Services: O processo de auto-inicialização serve para cadastrar Web Services que seram inicializados a automaticamente por uma determinada instância do iEngine. Sigua as instruções de ajuda do processo.
  13. Você poderá conferir o WSDL de publicação do Web Service acessando a URL: http://127.0.0.1:8081/myservice?wsdl;
  14. Em anexo o código da parte desenvolvida em java do exemplo desenvolvido neste artigo;

    Tela demonstrando a consumação do Web Service deste artigo na plataforma .NET:

Comments