Interoperabilidade na prática JEE 5(JBoss) com .NET (C# framework 3.5) parte 2

No post anterior mostrei como criar um Webservice em Java EE5 usando EJB3 e rodando a aplicação no JBoss AS 5.1, o webservice foi consumido em uma aplicação C#. Tudo isso foi possível por que as duas implementações(java e .net) implementam WS-I Basic Profile.

Neste post vou mostrar como criar um Webservice em Aspx usando C# como linguagem de implementação e vamos consumir este Webservice com uma aplicação Java usando o Jax-WS. Antes de começar vamos as dependências para execução destas aplicações.



Dependências das Aplicações
  • Java JDK 6_16
  • Jax-WS 2.1.x
  • eclipse 3.4.x
  • Visual Studio 2008
  • SoapUI
Aplicação .net

Agora vamos criar a aplicação .net que disponibiliza um Webservice. Abra o visual studio 2008 e crie uma aplicação do tipo ASP.NET Web Service, o visual studio vai criar um código de exemplo com um olá mundo, nos vamos modificar este código.

Atenção: O Visual Studio se perde quando mudamos o namespace e o nome da classe do Webservice, você precisa abrir o arquivo asmx e ajustar para o namespace e nome da classe corretamente, eu tive que faz isso via filesystem. :(

Agora nos vamos criar um interface a qual o Webservice ira implementar, esta interface é semelhante a interface que criei na aplicação Java no outro post.

IDateService.cs
using System;

namespace csharp.net.ws
{
// Summary:
//      Contrato do Serviço de datas
//
// Returns:
//     Retorna uma String contendo a data atual
//
public interface IDateService
{
string getDate();
}
}

A interface IDateService define o serviço de datas de forma igual a que foi feita em Java, agora vamos a implementação do Webservice.

DateServiceWS.asmx.cs
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;

namespace csharp.net.ws
{
/// 
/// Webservice feito em .net com C# que prove um serviço de datas.
/// 
[WebService(Namespace = "http://wsdotnet.csharp.diego.pacheco.blogspot.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class DateServiceWS : System.Web.Services.WebService, csharp.net.ws.IDateService
{
[WebMethod]
public string getDate()
{
DateTime dt = System.DateTime.UtcNow;
return dt.ToString("dd/MM/yyyy HH:mm:ss");
}
}
}

OK. Vou explicar os elementos importantes neste código C#.
  • [WebService]: Indica que este é um Webservice e deve ser exposto com tal. Estou definindo o namespace(pacote para o pessoal do Java).
  • [WebServiceBinding]: Indica através do ConformsTo que este webservice implementa WS-I Basic Profile 1.1.
A classe DateServiceWS extende a classe System.Web.Services.WebService do framework para trabalhar com Webservices e ainda implementa a interface que eu criei chamada de csharp.net.ws.IDateService.

Nota: Pessoal do java, em .net eu posso extender classes e implementar interfaces com o mesmo operador ":". Pessoal do .net em java para implementar uma interface eu preciso usar o operador "implements" e para extender tenho que usar o operador "extends".

Vamos ver o método getDate() que retorna a data atual do servidor Aspx no qual ele vai estar rodando, o mais importante aqui é o [WebMethod] que indica que este método é uma operação do Webservice.

Agora basta rodar esta aplicação no visual studio apertando F5, você pode entrar neste endereço no seu browser para obter o WSDL:

http://localhost:61561/DateServiceWS.asmx?WSDL

ok. Vamos testar o Webservice feito em .net com a ferramenta de testes de Webservices chamada SoapUI(Que é feita em Java :) ). Basta criar um projeto no SoapUI usando o WSDL que foi obtido na URL a cima e executar a operação getDate.

Teste do WS com o SoapUI 3

Aplicação Java

Agora vamos a aplicação Java, vou utilizar o Jax-WS 2.1.x vamos gerar as classes a partir do WSDL do Webservice .net, para isso vou utilizar o utilitário wsimport que esta no diretório $JAX_WS_RI_HOME\bin\wsgen.bat ou .sh se você usa linux. Copie o wsdl(DateServiceWS.asmx.xml) para a pasta bin do seu jaxws e execute o seguinte comando:

$ wsimport.bat -keep DateServiceWS.asmx.xml

agora ele ira gerar as classes no diretório bin do jaxws, agora basta criar um projeto no eclipse e colocar os fontes gerados em um source folder. Você ira precisar das dependências do Jax-WS no seu projeto para isso copie a pasta lib toda do seu jax-ws para o classpath do seu projeto do eclipse.

Agora vamos a classe Java que chama o Webservice feito em .net, confira o código a baixo:

package com.blogspot.diegopacheco.plainjava.wsclient;

import com.blogspot.pacheco.diego.csharp.wsdotnet.DateServiceWS;
import com.blogspot.pacheco.diego.csharp.wsdotnet.DateServiceWSSoap;

/**
* Classe wsclient que consome o WS feito em .net
*
* @author Diego Pacheco
* @version 1.0
* @since 31/08/2009
*
*/
public class WsClient {

public String getDate() {
DateServiceWS dsService = new DateServiceWS();
DateServiceWSSoap ds = dsService.getDateServiceWSSoap();
return ds.getDate();
}

public static void main(String[] args) {
WsClient wsc = new WsClient();
String dts = wsc.getDate();
System.out.println(dts);
}

}

Você pode perceber que criei o objeto DateServiceWS, depois obtive uma instância do objeto DateServiceWSSoap que é o objeto que representa o WS(proxy) agora basta chamar o método getDate() que é feito na seqüência.

Ao executar este código você deve ver a data atual no seu console semelhante a imagem a baixo:

Aplicação Java WSClient que consome o WS .net com Jax-WS

No próximo post vou mostrar uma aplicação Java EE5 rodando no JBoss AS 5.x que consome este mesmo WS e também como consumir este WS usando SOAP puro em Java. Se o leitor quiser pode pegar os fontes destas aplicações no meu repositório do Subversion:

Aplicação .net
Aplicação Java
Abraços e até a próxima.

Popular posts from this blog

Kafka Streams with Java 15

Rust and Java Interoperability

HMAC in Java