Spring no SOA Suite

O componente de Spring Context permite que você execute código Java dentro de uma aplicação SOA Suite de maneira mais robusta que o Java Embedding do BPEL.

Crie uma aplicação SOA Suite e no composite.xml, arraste o componente Spring Context (Component Pallete) para a raia do meio.

Create Spring

Create Spring

Clique em OK. Você deverá ter um componente com um folhinha verde no meio do composite. O próximo passo é criar uma interface e uma classe para ser utilizada com o Spring Context. Clique em File, New, Java Interface e clique em OK. Dê um nome, no meu exemplo vou dar o nome de OlaSpring. Clique em OK. Insira o seguinte conteúdo:

««« Clique aqui para ler o restante do conteúdo: Spring no SOA Suite »»»

Erro ao utilizar o cliente Soap no WebLogic

Para quem tentou utilizar o projeto de cliente Soap descrito nesse post no WebLogic, pode ter tido algum problema semelhante à esse:

java.lang.UnsupportedOperationException: This class does not support SAAJ 1.1
 at weblogic.webservice.core.soap.SOAPMessageImpl.getSOAPBody(SOAPMessageImpl.java:631)
 at org.gvlabs.utils.soap.SoapClient.invokeOperation(SoapClient.java:76)

Isso é porque é a implementação do SAAJ padrão do WebLogic é falha, conforme descrito nesse outro post. Como work-around segundo o artigo, seria só passar o seguinte parâmetro na inicialização do server do WebLogic:

««« Clique aqui para ler o restante do conteúdo: Erro ao utilizar o cliente Soap no WebLogic »»»

Chamando serviços SOAP sem Proxy, Stubs e afins

Uma das dificuldades em projetos com Web Services utilizando SOAP/XML é a necessidade de gerar as classes clientes para a invocação do serviço. Tá certo que isso é feito de maneira muito simples com as ferramentas necessárias, mas fiquei com uma certa inveja do PHP. Nesse artigo, podemos ver que é muito simples invocar serviços SOAP no PHP. Tá certo que não tem as validações de estrutura e verificações que o jeito tradicional Java tem, mas em alguns casos, como testes unitários de serviços é muito mais simples fazer dessa forma. Pensando nisso criei um utilitário para facilitar esse tipo de requisição.

É só colocar a lib no classpath e utilizá-la. Você pode fazer o download do fonte ou dessa lib no Google Code, o código fonte está disponível também no GitHub. Para utilizá-la é muito simples. Você pode inclusive fazer tudo em uma linha, dessa forma:

String response = new SoapClient("http://endpointhost.com/endpoint").invokeOperation("operation", "<payload>something</payload");

Ou se você quiser algo mais organizado, segue um exemplo de um serviço de conversão de peso:

		String endpoint = "http://www.webservicex.net/ConvertWeight.asmx";
		String operation = "http://www.webserviceX.NET/ConvertWeight";
		String input = "<web:ConvertWeight xmlns:web=\"http://www.webserviceX.NET/\">"
				+ "<web:Weight>7</web:Weight>"
				+ "<web:FromUnit>Grains</web:FromUnit>"
				+ "<web:ToUnit>Grams</web:ToUnit>" + "</web:ConvertWeight>";

		SoapClient soapClient = new SoapClient(endpoint);

		String response = response = soapClient.invokeOperation(operation, input);

O response terá o seguinte conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <ConvertWeightResponse xmlns="http://www.webserviceX.NET/">
         <ConvertWeightResult>0.4536</ConvertWeightResult>
      </ConvertWeightResponse>
   </soap:Body>
</soap:Envelope>

Agora vou usar nos meus testes de serviços.

Chamando um WebService SOAP com PHP

Para chamar um serviço no PHP 5 existe uma classe chamada SoapClient. A documentação pode ser encontrada no manual do PHP. Nesse exemplo, vamos utilizar um WebService SOAP de conversão de temperatura que está disponível online: http://www.webservicex.net/ConvertTemperature.asmx?WSDL

O exemplo básico consiste em criar um objeto SoapClient passando o WSDL e invocar o método “__soapCall” passando os parametros adequados. Para isso é só criar uma página PHP com o seguinte conteúdo:

««« Clique aqui para ler o restante do conteúdo: Chamando um WebService SOAP com PHP »»»

Telnet via WebService

Em vários projetos, é necessário integração com legado (sistema antigo que o cliente não quer migrar). E em alguns casos específicos essa integração pode ser um pouco mais complicada do que leitura de arquivos textos, troca de informações em base e afins. Nesse post eu irei explicar como criar um Web Service que faz a autenticação em um servidor Telnet e executa comandos nesse servidor. Essa é mais uma maneira (não tão convencional) de se realizar integração com legado.

Como client de Telnet, iremos utilizar a biblioteca Commons Net da Apache. Faça o download nesse site, descompacte-a e localize o jar da biblioteca. Crie um projeto e adicione as duas libs (jars) no classpath (build path no Eclipse e libraries no JDeveloper e Netbeans). Crie um WebService (JAX-WS) conforme o exemplo abaixo:

««« Clique aqui para ler o restante do conteúdo: Telnet via WebService »»»

BPEL com DBAdapter

Vamos criar um processo de histórico de informações. O processo consiste em gravar a data/hora, uma mensagem da operação feita e um identificador em uma tabela do banco. Como não será necessário aguardar por uma resposta, vamos configurar o serviço como One Way BPEL Process.

Instale o plugin do SOA Suite, conforme descrito na seção Instalação JDeveloper + Extensions do  post: http://www.thiagovespa.com.br/blog/2010/12/23/oracle-soa-e-bpm-suite/

Abra o JDeveloper, vá em File, New, General, Applications, SOA Application, clique OK. Dê um nome para sua aplicação e clique em Next. Dê um nome para o projeto e clique em Next. Selecione Composite With BPEL Process e clique em Finish.

Na próxima tela, selecione a especificação do BPEL (estou utilizando a 2.0), informe o nome do processo, namespace, o template (One Way BPEL Process), o Service Name e clique OK.

Create BPEL Process

Create BPEL Process

Ele irá criar um projeto SOA composite com o processo BPEL. No Application Navigator (Ctrl+Shift+A). Abra o XSD criado, SOA Content, xsd, HistoricoBPELProcess.xsd (no meu caso). Insira os elementos que serão enviados para o processo. O meu ficou da seguinte forma:

HistoricoBPELProcess.xsd

HistoricoBPELProcess.xsd

Se você quiser, pode utilizar o código abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<schema attributeFormDefault="unqualified"
	elementFormDefault="qualified"
	targetNamespace="http://xmlns.thiagovespa.com.br/BPELSampleApp/BPELDBAdapter/HistoricoBPELProcess"
	xmlns="http://www.w3.org/2001/XMLSchema">
	<element name="process">
		<complexType>
			<sequence>
				<element name="identificador" type="string"/>
				<element name="data" type="date"/>
				<element name="mensagem" type="string"/>
			</sequence>
		</complexType>
	</element>
</schema>

Abra o processo BPEL, e na Component Palette (Ctrl+Shift+P) abra a aba BPEL Services e arraste o Database Adapter para o Partner Links. Irá abrir o Adapter Configuration Wizard, clique em Next. Dê um nome para o serviço, clique em Next. Clique no + para adicionar uma nova conexão, informes os dados de conexão e clique OK. Especifique o nome JNDI para a conexão ou utilize o padrão e clique em Next.

Na próxima tela, escolha as opções a serem executadas. No nosso caso, vai ser insert only. Clique em Next.

Adapter Configuration Wizard - Step 4 of 5

Adapter Configuration Wizard - Step 4 of 5

Clique em Import Tables para selecionar a tabela de histórico. Selecione a tabela e clique OK e Next. Na próxima tela informe os relacionamentos entre tabelas. No nosso caso não teremos, então clique em Next. Selecione as colunas que serão inseridas e clique em Next. Informe os parâmetros de tentativa e sequences e clique em Next. Clique em Finish para terminar. Na tela do Create Partner Link, clique em OK.

No Component Palette, abra a aba BPEL Constructs e arraste o nó Invoke para logo abaixo do receiveInput. Clique em uma setinha lateral do Invoke e arraste até o Partner Link do DBAdapter criado. Abrirá a janela de Edição do Invoke. Mude o nome para algo mais amigável, por exemplo: insercaoHistorico. Em Input, clique no mais, insira uma nova variável e pressione OK. Faça o mesmo procedimento com o Output. Pressione OK.

Adicione uma atividade de Assign entre o receiveInput e o insercaoHistorico. Dê dois cliques e na aba Copy Rules faça as associações dos dados recebidos com os dados a serem inseridos.

Edit Assign

Edit Assign

Altere os nomes dos nós para ficarem mais amigáveis.

HistoricoBPELProcess

HistoricoBPELProcess

Agora vamos configurar o Database Adapter no servidor. Suba o servidor com o SOA Suite. Acesse o console do WebLogic Server. No domínio, acesse Services, Data Sources, New, Generic Data Source. Informe um Nome (DBAdapterSample), um JNDI Name (jdbc/DBAdapterSample). escolha o tipo da base (Oracle) e clique em Next. Informe o driver e clique em Next. Se for XA você não precisa configurar mais nenhuma opção, aí é só clicar em Next. Informe os dados de conexão, clique em Next. Clique em Test Configuration, se tudo for OK, clique em Next, senão clique em Back e altere as configurações. Selecione o servidor e clique em Finish.

Vá em Deployments e procure por DBAdapter. Selecione ele, clique em Configuration. Selecione Outbound Connection Pools e clique em New. Escolha javax.resource.cci.ConnectionFactory e clique em Next. Insira o JNDI Name que você informou ao criar o DBAdapter no processo BPEL (eis/DB/DBAdapterSample). Lembre-se que esse JNDI deve ser diferente do Data Source. Clique em Finish. Selecione o Outbound Connection Pool criado. Na aba Properties, atribua o valor do JNDI do Data Source (jdbc/DBAdapterSample) na propriedade xADataSourceName. Dica: pressione Enter para efetuar as alterações. Clique em Save.

Vá novamente em Deployment, marque o checkbox do DbAdapter, clique em Update. Marque a opção “Redeploy this application using the following deployment files”. Clique em Next e Finish.

No JDeveloper, clique com o botão direito no projeto, Deploy e escolha a aplicação. Selecione Deploy to Application Server, clique em Next. Atribua o número de revisão e clique em Next. Caso você não tenha adicionado o servidor, clique no + e configure o servidor SOA, caso contrário, selecione o servidor e clique em Next. Escolha o Partition, clique em Next e Finish para realizar o deploy.

Acesse o Enterprise Manager, SOA, soa-infra, default (partition) e escolha sua aplicação. Clique no botão Test. Informe os 3 parâmetros e clique em Test Web Service.

Pronto.. as informações devem ter sido inseridas no banco de dados. Acompanhe o que foi feito no processo clicando no botão Lauch Flow Trace.

(Oracle SOA Composite)”]BPELDBAdapter [1.0] (Oracle SOA Composite)

BPELDBAdapter [1.0

Mocking com soapUI

Nesse artigo vamos abordar a criação de mocking (simulação) de serviços utilizando soapUI. O soapUI é uma ferramenta muito boa de testes para arquiteturas orientadas à serviços (SOA). Para instalá-lo é só acessar o site: http://sourceforge.net/projects/soapui/files/ e descompactar ou baixar um instalador e seguir o passo a passo.

Pra que serve o mocking de serviços? Quando você não tem o serviço, ou porque ele está em desenvolvimento, ou por algum motivo de infra estrutura, você pode simular esse serviço. O soapUI faz isso de uma maneira bem simples, sendo necessário somente o WSDL. Se você não sabe o que é WSDL, dê uma olhada no tutorial da W3Schools. Utilizarei o seguinte WSDL para a criação do mocking:

<?xml version="1.0" encoding="UTF-8" ?>
<definitions targetNamespace="http://www.thiagovespa.com.br/"
             xmlns="http://schemas.xmlsoap.org/wsdl/"
             xmlns:tns="http://www.thiagovespa.com.br/"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
             xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/">
  <types>
    <xsd:schema targetNamespace="http://www.thiagovespa.com.br/types"
                elementFormDefault="qualified"/>
  </types>
  <message name="blogServicesRequest">
    <part name="in" type="xsd:string"/>
  </message>
  <message name="blogServicesResponse">
    <part name="return" type="xsd:string"/>
  </message>
  <portType name="ThiagoVespaBlogServices">
    <operation name="GetBlogPost">
      <input message="tns:blogServicesRequest"/>
      <output message="tns:blogServicesResponse"/>
    </operation>
  </portType>
  <binding name="ThiagoVespaBlogServicesSOAP11Binding"
           type="tns:ThiagoVespaBlogServices">
    <soap:binding style="document"
                  transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="GetBlogPost">
      <soap:operation style="document"
                      soapAction="http://www.thiagovespa.com.br/getBlogPost"/>
      <input>
        <soap:body use="literal" parts="in"/>
      </input>
      <output>
        <soap:body use="literal" parts="return"/>
      </output>
    </operation>
  </binding>
</definitions>

O primeiro passo é abrir o soapUI e criar um novo projeto. Clique em File, New soapUI Project. Preencha o Project Name e a localização do WSDL e clique em OK.

New soapUI Project

New soapUI Project

Clique com o botão direito no binding (ThiagoVespaBlogServicesSOAP11Binding) e selecione Generate Mock Service. Informe o nome do seu MockService e pressione OK.

Add to MockService

Add to MockService

Pressione Yes para abrir o editor de MockResponse. No lugar do ‘?’ insira a resposta do seu MockService. No meu caso eu inseri o seguinte:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <return>Retorno do GetBlogPost</return>
   </soapenv:Body>
</soapenv:Envelope>

Dê dois cliques no seu MockService (MockServiceBlogPost). Caso deseje alterar as configurações de path, porta e host, clique no ícone de ferramentas e especifique o valor desejado. No meu caso vou alterar a porta para 8085 e path para \getBlogPost.

MockService Options

MockService Options

Pressione OK e clique no ícone de play para colocar o serviço em execução.

soapUI 3.6.1

soapUI 3.6.1

Para verificar se o serviço está em execução, abra a URL do serviço no browser.

Mozilla Firefox

Mozilla Firefox

Agora você já está apto a utilizar esse serviço na sua aplicação. Caso queira verificar a execução, dê dois cliques no Response 1 do GetBlogPost contido no MockServiceBlogPost, clique no primeiro ícone do canto superior esquerdo escrito SOAP. No combo, clique em Create New e clique em OK.

Open Request

Open Request

Dê um nome e pressione OK. Informe a requisição e pressione play.

soapUI 3.6.1 - 3

soapUI 3.6.1 - 3

Pronto, serviço testado e validado. Isso é um mocking básico, mas com esse recurso não precisamos depender da implementação real do serviço e podemos agilizar o teste e desenvolvimento de softwares que utilizam arquitetura baseada em serviços.

Client JAX-RPC no Netbeans 6.9

O JAX-RPC é uma API que permite a invocação serviços web definido por um arquivo WSDL. Na sua nova versão foi renomeada para JAX-WS. O motivo da substituição do nome vai além da possível confusão de RPC com Webservices. Os detalhes da mudança do nome você pode encontrar aqui: http://weblogs.java.net/blog/kohlert/archive/2005/05/jaxrpc_20_renam.html

O Netbeans possui um plugin para JAX-WS, mas em alguns casos você pode precisar utilizar a versão antiga (o JAX-RPC) devido ao formato da definição de serviço especificado e ao tentar utilizar no Netbeans você pode receber o seguinte erro:

You must download JAX-RPC support plugin to create a JAX-RPC client

New Web Service Client

New Web Service Client

Ao acessar a seção de plugins, o plugin para JAX-RPC não existe. Para instalá-lo é necessário utilizar um update center de desenvolvimento que é construído periodicamente pelo hudson dos projetos do Netbeans. Vamos ao passo a passo. Abra o Netbeans, vá no menu Tools, Plugins, Settings, Add.

Plugins

Plugins

No nome coloque: “NetBeans Última Versão de Dev” e na URL coloque: http://deadlock.netbeans.org/hudson/job/nbms-and-javadoc/lastStableBuild/artifact/nbbuild/nbms/updates.xml.gz

Pressione OK. Vá em Available Plugins e selecione JAX-RPC Web Services (que existe agora). Clique em Install. Na próxima tela, clique em Next, concorde com os termos se deseja prosseguir e clique em Install.

NetBeans IDE Installer

NetBeans IDE Installer

Clique em Finish e Close. Crie um novo projeto Java. No novo projeto criado, clique com o botão direito, New, Other, Web Services, Web Service Client, Next. Selecione o WSDL, informe o pacote e clique em Finish. Aguarde alguns segundos e as classes geradas ficarão disponíveis em Generated Sources (jax-rpc).

IDBIPoc - NetBeans IDE 6.9.1

IDBIPoc - NetBeans IDE 6.9.1

Aí é só criar um classe Java para utilizar o que foi criado. Se você quiser pode testar o serviço acessando o nó Web Service References na aba Projects.

Test Web Service Operation

Test Web Service Operation

Ou alterar as propriedades do cliente de Web Service criado:

Project Properties - IDBIPoc

Project Properties - IDBIPoc