Web Service .NET acessado por Java e SOA [RESOLVIDO]

Galera…

Procurei muuuito e ainda não consegui o que quero =/
Ainda estou lendo… testando e tentando… mas ta dificil… cheguei em um ponto te ter muitos caminhos para seguir… muitas bibliotecas para baixar que estou achando que vou pegar o caminho errado… então acho melhor ter uma ajuda ou mesmo uma indicação de vocês…

Os post’s que já li:

http://www.guj.com.br/posts/list/135/72325.java#700239

http://www.guj.com.br/posts/list/0/81068.java#701040

http://blogs.mentaframework.org/posts/list/14404.page

http://xstream.codehaus.org/tutorial.html

http://www.netbeans.org/kb/docs/websvc/gs-axis_pt_BR.html#install_apache

Meu ambiente é o seguinte… tenho um WebService escrito em .NET com um método de HelloWorld que ao acessar pelo browser ele me dá o seguinte WSDL (agora que vi… esse não eh mesmo o WSDL… =/ abri um WSDL aki e vi que as tags são diferentes):

SOAP 1.2
The following is a sample SOAP 1.2 request and response. The placeholders shown need to be replaced with actual values.

[code]POST /NF-e/NF-e.asmx HTTP/1.1
Host: mw-112
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>

<soap12:Envelope xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:soap12=“http://www.w3.org/2003/05/soap-envelope”>
soap12:Body

</soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>

<soap12:Envelope xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=“http://www.w3.org/2001/XMLSchema” xmlns:soap12=“http://www.w3.org/2003/05/soap-envelope”>
soap12:Body

string

</soap12:Body>
</soap12:Envelope>
[/code]

Como desenvolvimento to usando o eclipse 3.4 com os plugis para desenvolvimento web… e vou começar um novo projeto (precisa ser algum projeto especifico do eclipse ???)… pois o outro ja ficou meio bagunçado… ^^

De bibliotecas extras baixei a xstream-distribution-1.3.1-bin.zip.

Agora estou com duvidas sobre as outras bibliotecas… as que preciso para trabalhar com SAAJ e Axis2… porque não achei um pacote, algo do tipo… lib/*.jar como as que veem do XSTream… no final acabei baixando biblioteca a biblioteca pelo site http://www.java2s.com/Code/Jar/Web-Services-AXIS2/CatalogWeb-Services-AXIS2.htm, que foi onde comecei a me atrapalhar, pq acho que deu conflito no projeto…

Bom… meus próximos passos serão criar um projeto e adicionar as bibliotecas e tentar chamar esse método do WebService…

Para isso vou procurar seguir o tutorial da própria sun sobre JEE. (que vem com o download).

Acredito que terei problemas ao improtar as bibliotecas… algums dica ?

vlw

Bom… atpe aki esta dando certo…

No projeto apenas usei as bibliotecas do JDK1.6 e todas as classes do exemplo estão ok.

Segue o fonte para tentar chamar o HelloWorld do WSDL:

[code]import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;

import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;

public class CopyOfSOAHelloWorld {

public static void main(String[] args) {
	
	try{
		// 1 Criar a Mensagem com o protocolo desejado
		MessageFactory factory = MessageFactory.newInstance();
		SOAPMessage message = factory.createMessage();

		// 2 obter as partes do envelope
		SOAPHeader header = message.getSOAPHeader();
		SOAPBody body = message.getSOAPBody();
		
		header.detachNode(); // elima o cabecalho, caso nao va utiliza-lo
		
		// 3 montar o corpo com os elementos desejados (metodos do WS a serem chamados)
		//HelloWorld no meu exemplo
		QName bodyName = new QName("http://MeuWebService.NET/Metodos.asmx", "HelloWorld", "m");
		SOAPBodyElement bodyElement = body.addBodyElement(bodyName);
		
		SOAPElement symbol = bodyElement.addChildElement(new QName("symbol"));
		symbol.addTextNode("HW");
		
		// 4 Montar a conexão com o WS
		SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
		SOAPConnection connection = soapConnectionFactory.createConnection();
		URL url = new URL("http://MeuWebService.NET/Metodos.asmx");
		SOAPMessage response = connection.call(message, url);
		
		// 5 Pegar o retorno da chamada
		SOAPBody soapBody = response.getSOAPBody();
		Iterator iterator = soapBody.getChildElements(bodyName);
		SOAPBodyElement repsonseElement = (SOAPBodyElement)iterator.next();  // ERRO AKI !!!
		String msg = repsonseElement.getValue();
		
		System.out.println(msg);
		
	}catch(SOAPException e){
		e.printStackTrace();
	} catch (MalformedURLException e) {
		e.printStackTrace();
	}
}

}
[/code]

E o erro ate o momento, na hora de tentar recuperar o retorno do método, esse exemplo montei com ajuda do tutorial, vou analizar com calma para resolver… mas se alguem ai ja matar de cara… agradeço !!! =]

Exception in thread "main" java.util.NoSuchElementException at com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl$3.next(ElementImpl.java:764) at integrar.net.SOAHelloWorld.main(SOAHelloWorld.java:48)

Bom… estou tentendo de outroa forma… com a ajuda do João

Parei no eclipse onde peço apra criar um novo WebService… ao informar o ServiceDefinition, coloco o endeço do WSDL… onde percebi que o XML na verdade eh algumas informações… e não realmente o meu arquivo WSDL… =/

Ou seja… ele me fala que o arquivo está inválido… Parece que terei que criar um WSDL para o meu metodo HelloWorld antes de fazer esse passo…

Opa… eae…

Eh o seguinte… fiz um teste com o WebService usando .NET… (tive que usar a ferramenta da microsoft… =/)

Enfim… no projeto que criei consegui acessar os metodos do WebService… tudo no next - next - next…

No final vi que foi criado um arquivo WSDL que descreve todos os metodos do webservice… com Request e Response… Tentei usar esse mesmo WSDL pelo eclipse criando um projeto “WebService Client” e indicando o caminho do arquivo WSDL… mas n deu certo… disse que o arquivo eh invalido…

Com isso posso dizer que para cada linguagem o WSDL eh diferente ??

No momento estou instalando o plugin WSDL Extensions Generator no eclipse… dessa forma espero gerar o WSDL e em seguida criar a classe que irá consumir os metodos… Estou no caminho certo ?

Vlw !!


Opa… acho que mais um passo realizado…

Criei um “WebService Client” baseado no WSDL correto (Consegui usar o mesmo do .NET, estava errando no caminho, que não pode ser o o arquivo WSDL direto… precisa usar a URL).

Bom… agora meu projeto tem um monte de classes (6 ao todo) que ainda não sei como usar… ^^
mas imagino… pois tem Soap e Soap12 no nome… hehe

Espero estar indo pelo cominho certo… se eh o mais facil… nao sei ainda… hehe

Fui !

Puts… acho que consegui !!!

Se for isso mesmo… que blza…

As classes que o WSDL2Java criou ficou lindo…

Depois que olhei os a estrutura das classes… so precisei digitar essas 3 linhas de codigo para testar meu metodo helloWorld…

[code]public static void main(String[] args) throws RemoteException, ServiceException {
MetodosWSLocator loc = new MetodosWSLocator();
MetodosWSSoap soap12 = loc.getMetodosWSSoap12();

System.out.println(soap12.helloWorld());

}[/code]

Funcionou numa boa… (ao menos para esse metodo basico) hehe

Ele importou biblioteca de tudo que eh lugar… do TomCat, do JDK 1.5 (no meu caso) mais axis.jar, saaj.jar e wsdl4j.jar entre outras…

Tô vendo que vou ter um pouco de trabalho para jogar esse exemplo dentro da minha aplicação… =/

Bom galera… ngm comentou nada… mas espero que tenham lido e que alguem venha a aprender algo com o post… ^^
E se algo ai puder ser feito de outra forma… por favor postem…

Ah… outro link que me deu uma força… http://www.ibm.com/developerworks/br/library/ws-webaxis1/index.html

Se precisar de alguma força extra… me manda MP…

Fui !