Data de postagem: Mar 31, 2011 7:52:55 PM
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.
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.
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:
commons-logging-1.1.1.jar
cxf-2.1.3.jar
geronimo-activation_1.1_spec-1.0.2.jar
geronimo-annotation_1.0_spec-1.1.1.jar
geronimo-javamail_1.4_spec-1.3.jar
geronimo-servlet_2.5_spec-1.2.jar
geronimo-ws-metadata_2.0_spec-1.1.2.jar
jaxb-api-2.1.jar
jaxb-impl-2.1.7.jar
jaxws-api-2.1.jar
jetty-6.1.9.jar
jetty-util-6.1.9.jar
neethi-2.0.4.jar
saaj-api-1.3.jar
saaj-impl-1.3.2.jar
wsdl4j-1.6.2.jar
wstx-asl-3.2.6.jar
stax-api-1.0.1.jar
xml-resolver-1.2.jar
XmlSchema-1.4.2.jar
enginelet-2.0.jar
commons-beanutils.jar
commons-beanutils-bean-collections.jar
commons-beanutils-core.jar
commons-collections-3.2.jar
commons-lang-2.3.jar
commons-logging-adapters-1.1.1.jar
commons-logging-api-1.1.1.jar
ezmorph-1.0.4.jar
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.
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.
Selecione o pacote criado e cria um crie um classe chamada Entidade.
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.
Crie uma interface chamada MyService. Vá em File/New/Interface..., informe o nome MyService para a interface e clique no botão Finish.
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.
Crie um classe chamada MyServiceImpl que implemente a interface MyService.
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.
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;
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;
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:
Atráves do processo Ir Para\Desenvolvimento\Web Services\Web Services Publicados: Sigua as instruções de ajuda do processo.
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.
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.
Você poderá conferir o WSDL de publicação do Web Service acessando a URL: http://127.0.0.1:8081/myservice?wsdl;
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: