Criando serviços com o WSO2 – Parte 2 – WSO2 WSAS

Hoje vamos dar continuidade ao exemplo de como criar um serviço usando as ferramentas do WSO2, no post anterior criamos o Data Services, hoje estaremos criando o nosso Business Service e publicar no WSO2 WSAS.

O nosso Business Service será responsável por conter a regra de negócio do nosso serviço, ou seja, para uma determinada entrada vindo da BUS vamos consumir o Data Service aplicar a nossa regra de negócio e retornar os dados para a BUS. Esse é o momento onde vamos meter a mão na massa e codificar em Java.

Para consumir o Data Service vamos estar usando o Apache Axis2, que é um framework para contrução e consumo de webservices, portanto clique aqui e faça o download, a versão que estou usando é 1.5.1. Depois de concluído o download descompactar o arquivo e copiar para um diretório de sua preferência.

Criando um Business Service

1. Abra o Eclipse e vamos criar um novo projeto, clique em File -> New -> Project

Na nova janela que abriu, selecione Java Project clique em Next.

Coloque o nome do projeto com RecursoHumanoServico depois clique em Finish

Para deixar nosso projeto mais organizado vamos criar duas Package, clique com o botão direito em cima da pasta src  e selecione a opção New -> Package

Coloque o nome do package de br.leandroprado.webservices.recursohumano


Adicione mais um package com o nome de br.leandroprado.webservices.recursohumano.entidades, veja como seu projeto deve ficar depois de criado as duas packages

2. Depois de configurado o o projeto temos que adicionar as bibliotecas do Axis2 que vamos utilizar, clique em Project -> Properties

Na nova janela que abrir, clique em Java Build Path -> Libraries

Clique no botão Add External JARs e vá até o diretório onde esta o Axis2, que baixamos anteriormente e selecione os seguintes JARs.

Veja que em Libraries foi adicionado os JARs do Axis2.

3. Agora vamos começar a codificar o nosso serviço, clique com o botão direito em cima da package  br.leandroprado.webservices.recursohumano e selecione a opção New -> Class

Coloque o nome da nova classe de RecursoHumanoServico e clique em Finish

Vamos criar outra classe dentro da package br.leandroprado.webservices.recursohumano.entidades chamada Funcionario

Veja abaixo o conteúdo da classe Funcionario.java, ela contém os campos que o nosso DataService retorna.

[sourcecode language=”java”]
package br.leandroprado.webservices.recursohumano.entidades;

import java.util.Date;

public class Funcionario {

private int codigo;
private String nome;
private String endereco;
private String sexo;
private String dataAniversario;

public int getCodigo() {
return codigo;
}

public void setCodigo(int codigo) {
this.codigo = codigo;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getEndereco() {
return endereco;
}

public void setEndereco(String endereco) {
this.endereco = endereco;
}

public String getSexo() {
return sexo;
}

public void setSexo(String sexo) {
this.sexo = sexo;
}

public String getDataAniversario() {
return dataAniversario;
}

public void setDataAniversario(String dataAniversario) {
this.dataAniversario = dataAniversario;
}
}
[/sourcecode]

Agora vamos criar o serviço, na classe RecursoHumanoServico vamos adicionar um novo método onde vamos chamar o nosso método do DataService, veja abaixo o código;

[sourcecode language=”java”]
package br.leandroprado.webservices.recursohumano;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

import br.leandroprado.webservices.recursohumano.entidades.Funcionario;

public class RecursoHumanoServico {

// endereco do WSDL do DataService
private static EndpointReference rhEndpoint = new EndpointReference("http://10.0.2.15:9764/services/RecursoHumanoServico?wsdl");

public Funcionario[] pesquisarFuncionario(String nome)
{
String nameSpace = "http://webservices.leandroprado.com.br/DataServices/RecursoHumano/PesquisarFuncionario";
String nomeMetodo = "PesquisarFuncionario";

List<Funcionario> lst = new ArrayList<Funcionario>();

try {
// verifica se o parametro esta preenchido
if(nome != null)
{
if(nome.equals(""))
throw new Exception("Campo Nome é obrigatório!");
}
else
throw new Exception("Campo Nome é obrigatório!");

// cria os parametros do servico com o EndPoint e o método que queremos usar
Options options = new Options();
options.setTo(rhEndpoint);
options.setAction("urn:" + nomeMetodo);

// cria um client para o servico
ServiceClient sender = new ServiceClient();
sender.setOptions(options);

// para criar os parametros de entrada do servico
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace(
nameSpace, // namespace do método
nomeMetodo); // nome do método que vamos invocar
OMElement payload = fac.createOMElement(nomeMetodo, omNs);

// seta o nome dos parametros de entrada e seu conteudo
OMElement param = fac.createOMElement("Nome", omNs);
param.setText("%" + nome + "%");
payload.addChild(param);

// Executa o DataService
OMElement result = sender.sendReceive(payload);

// Recupeara o retorno
Iterator rows = result.getChildElements();

// Enquanto houver linhas no retorno
while (rows.hasNext()) {
OMElement row = (OMElement) rows.next();

// recupera os elementos
OMElement codigo = row.getFirstChildWithName(new QName(omNs.getNamespaceURI(), "CodigoFuncionario"));
OMElement nme = row.getFirstChildWithName(new QName(omNs.getNamespaceURI(), "NomeFuncionario"));
OMElement endereco = row.getFirstChildWithName(new QName(omNs.getNamespaceURI(), "EnderecoFuncionario"));
OMElement sexo = row.getFirstChildWithName(new QName(omNs.getNamespaceURI(), "SexoFuncionario"));
OMElement dataAniver = row.getFirstChildWithName(new QName(omNs.getNamespaceURI(), "DataAniversario"));

// cria um objeto do tipo Funcionario
Funcionario _fun = new Funcionario();
_fun.setCodigo(Integer.parseInt(codigo.getText()));
_fun.setNome(nme.getText());
_fun.setEndereco(endereco.getText());
_fun.setSexo(sexo.getText());
_fun.setDataAniversario(dataAniver.getText());

// Adiciona na lista
lst.add(_fun);
}
}
catch(Exception ex)
{
throw new RuntimeException(ex.getMessage());
}

// verifica se a lista possui elementos
if(lst.size() > 0)
return lst.toArray(new Funcionario[lst.size()-1]);
else
return lst.toArray(new Funcionario[0]);
}
}
[/sourcecode]

4. Agora vamos publicar o serviço no WSO2 WSAS, primeiro de tudo temos que iniciar os serviços WSO2 DataServices e WSO2 WSAS, já vimos no post Criando um ambiente SOA com WSO2 como criar o ambiente e iniciar os serviços.

Uma das maneiras de fazer o deploy de um serviço para o WSAS é exportar nosso serviço para um arquivo .jar, então  clique com o botão direito em cima do projeto RecursoHumanoServico e selecione a opção Export.

Selecione a opção Jar File, e clique em Next

Agora selecione em qual diretório vamos salvar o arquivo .jar, nesse caso estou salvando no Desktop e clique em Finish

Acessando nosso diretório Desktop o arquivo exportado.

Agora vamos fazer o Deploy do arquivo .jar para o WSAS, acessar o console de administração do WSAS e selecionar a opção Services -> Add -> Jar Service

Coloque o nome do seu serviço e procure o arquivo .jar que exportamos anteriormente, e clique em Next

Na próxima tela temos que selecionar qual classe que queremos expor como serviço, em nosso exemplo é a classe RecursoHumanoServico.java, não esqueça de selecionar o escopo que é SOAP, depois clique em Next

Selecione os métodos que deseja disponibilizar no serviço, em nosso exemplo só temos um método, mas se tivesse vários métodos poderiamos selecionar quais deles vamos disponibilizar para consumo, depois clique em Finish.

Se tudo ocorrer sem erros, uma mensagem será exibida e o nosso serviço vai aparecer na lista, veja abaixo:

Vamos testar nosso método, clique em Try this Service , preencha o parâmetro nome e clique no botão, o seguinte resultado deverá ocorrer:

Vamos testar se a nossa validação está sendo executada, se invocar o método sem nenhum valor para o parâmetro nome, deve retornar um erro, veja abaixo:

Conclusão

Podemos ver que para criar um BusinessServer usando o WSAS não tem muito segredo, para quem ja programa em JAVA não vai ter nehuma dificuldade.

O que podemos fazer para facilitar o consumo é criar um componente onde só passamos o método que queremos consumir e ele nos retorna um objeto criado, fica por conta de vocês aprimorar esse código.

O WSO2 lançou um plugin para o Eclipse que cria serviços para o WSAS, com esse plugin é possível fazer debug dos nossos métodos, dessa forma facilitando o desenvolvimento para o programador.

Create an Axis2 Web Service in 3 Steps Using Eclipse

How to Debug Your Axis2 Web Service in 3 Steps Using Eclipse

No próximo post estaremos criando a camada da BUS, vamos criar um proxy para disponibilizar os serviços aos nossos clientes.

Download Parte 2

Até a próxima!

Sobre Leandro Prado

Leandro Silveira Prado é Premier Field Engineer na Microsoft especializado em Application Lifecycle Management.