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
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
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
OK. Vou explicar os elementos importantes neste código C#.
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.
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:
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:
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:
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
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.
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.
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.
Aplicação .net
Aplicação Java
Abraços e até a próxima.