Posted by Brunno Attorre On April - 27 - 2014 0 Comment

Olá pessoal, tudo bem? Hoje iremos passar por um tópico simples porém de extrema importância para a tecnologia atual de desenvolver Java Web Services. Web Services são serviçoes disponibilizados via o protocolo HTTP que permitem, através de requisições HTTP, que sistemas se comuniquem.

A maior força dos Web Services está no ponto de que eles são independentes de tecnologia, ou seja, podemos nos comunicar entre sistemas de tecnologias diferentes (C# e Java, por exemplo) de forma transparente.
Atualmente, existem dois tipos principais de Web Services: SOAP e REST. Nesse post, iremos abordar os serviços SOAP que tem, como característica de funcionamento, uma requisição HTTP de POST contendo, dentro de seu payload, o chamada envelope SOAP.

Um envelope SOAP nada mais é que uma estrutura em XML que permite, dentro de seu conteúdo, que seja enviado informações relevantes ao seu serviço.

Iniciando nosso projeto SOAP

Para iniciarmos nosso projeto Java Web Service em SOAP precisamos, primeiramente, de um servidor de aplicação (ou de um Web Container) compatível com a tecnologia JAX-WS. No nosso caso, vamos realizar a construção de nosso Java Web Service através do servidor de aplicação JBoss 7.1 (http://jbossas.jboss.org/).

Dentro de nossa IDE, podemos iniciar o serviço escolhendo a opção New->Dynamic Web Project.

WebServiceProject

Uma vez o projeto nomeado e o runtime setado para o JBoss 7.1, podemos começar nosso desenvolvimento. Para isso, nosso primeiro passo deve ser criar uma classe que representará a estrutura da mensagem que iremos receber, ou seja, nosso payload. Para isso, criamos a classe Mensagem, dentro do projeto recém criado.

public class Mensagem {

    private Date timestamp;
    private String nomeGrandeza;
    private String unidadeGrandeza;
    private String valor;
    
    public Date getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(Date timestamp) {
        this.timestamp = timestamp;
    }
    public String getNomeGrandeza() {
        return nomeGrandeza;
    }
    public void setNomeGrandeza(String nomeGrandeza) {
        this.nomeGrandeza = nomeGrandeza;
    }
    public String getUnidadeGrandeza() {
        return unidadeGrandeza;
    }
    public void setUnidadeGrandeza(String unidadeGrandeza) {
        this.unidadeGrandeza = unidadeGrandeza;
    }
    public String getValor() {
        return valor;
    }
    public void setValor(String valor) {
        this.valor = valor;
    }
    
}

Conforme podemos ver, essa classe é um simples POJO. Nosso próximo passo será, portanto, criar o WebService responsável por receber essa mensagem. Para isso, criamos nossa classe ReceiveMessageWS:

@WebService
public class ReceiveMessageWS {
    
    @WebMethod(operationName="receiveMessage")
    public void receiveMessage(Mensagem msg){
        //Faça a lógica com a mensagem
    }
}

Se olharmos a implementação, ela é bem simples. Temos em nossa classe, a anotação de que se trata de um WebService e, dentro do método, a anotação indicando que se trata de um método desse WebService e seu nome.

Toda a transformação do XML para a entidade Mensagem que criamos será feita automaticamente pelo Java, facilitando ainda mais nosso trabalho.

Para testarmos, basta deployarmos nossa aplicação no JBoss 7.1. Para isso, clique com o botão direito e escolha Run As-> Run on Server, escolhendo logo após o JBoss.

Uma vez de pé nosso servidor, podemos acessar o WSDL (descritor de nossos serviços SOAP) olhando o log de nosso JBoss, onde teremos uma linha indicando o caminho de nosso descritor. No nosso exemplo, o caminho foi

12:18:55,493 INFO  [org.jboss.wsf.stack.cxf.deployment.WSDLFilePublisher] (MSC service thread 1-1) WSDL published to: file:/C:/jboss-as-7.1.1.Final/standalone/data/wsdl/AquisicaoDados.war/ReceiveMessageWSService.wsdl

Abrindo o WSDL, teremos a descrição de nosso serviço:

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions name="ReceiveMessageWSService" targetNamespace="http://endpoint.aquisicao.smh.fci.mackenzie.com.br/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://endpoint.aquisicao.smh.fci.mackenzie.com.br/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
<xs:schema elementFormDefault="unqualified" targetNamespace="http://endpoint.aquisicao.smh.fci.mackenzie.com.br/" version="1.0" xmlns:tns="http://endpoint.aquisicao.smh.fci.mackenzie.com.br/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="receiveMessage" type="tns:receiveMessage"/>
<xs:element name="receiveMessageResponse" type="tns:receiveMessageResponse"/>
<xs:complexType name="receiveMessage">
    <xs:sequence>
      <xs:element minOccurs="0" name="arg0" type="tns:mensagem"/>
    </xs:sequence>
  </xs:complexType>
<xs:complexType name="mensagem">
    <xs:sequence>
      <xs:element minOccurs="0" name="nomeGrandeza" type="xs:string"/>
      <xs:element minOccurs="0" name="timestamp" type="xs:dateTime"/>
      <xs:element minOccurs="0" name="unidadeGrandeza" type="xs:string"/>
      <xs:element minOccurs="0" name="valor" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
<xs:complexType name="receiveMessageResponse">
    <xs:sequence/>
  </xs:complexType>
</xs:schema>
  </wsdl:types>
  <wsdl:message name="receiveMessageResponse">
    <wsdl:part element="tns:receiveMessageResponse" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="receiveMessage">
    <wsdl:part element="tns:receiveMessage" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="ReceiveMessageWS">
    <wsdl:operation name="receiveMessage">
      <wsdl:input message="tns:receiveMessage" name="receiveMessage">
    </wsdl:input>
      <wsdl:output message="tns:receiveMessageResponse" name="receiveMessageResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="ReceiveMessageWSServiceSoapBinding" type="tns:ReceiveMessageWS">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="receiveMessage">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="receiveMessage">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="receiveMessageResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ReceiveMessageWSService">
    <wsdl:port binding="tns:ReceiveMessageWSServiceSoapBinding" name="ReceiveMessageWSPort">
      <soap:address location="http://localhost:8080/AquisicaoDados/ReceiveMessageWS"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Em nosso próximo post, faremos um exemplo de como construir um serviço WS em REST.

About the author

Brunno Attorre

Entusiasta de novas tecnologias, está sempre a procura de inovações que podem mudar o mundo. Desenvolvedor Java e C++, com certificados OCJP, OCWCD e OCEEJBD, seus interesses envolvem Inteligência Artificial, Big Data, Data Analysis, BI, sistemas distribuídos e sistemas de alta performance. Google+

Be Sociable, Share!

Protected by WP Anti Spam