Exemplo de Serviços da Web SOAP em Java usando Eclipse

Serviços da Web de SOAP em Java podem ser desenvolvidos de várias maneiras. Aprendemos sobre Serviços da Web de SOAP JAX-WS em nosso último tutorial, hoje vamos aprender como podemos criar um serviço da Web SOAP e seu programa cliente usando o Eclipse. Aqui não vamos usar JAX-WS, vamos utilizar Apache Axis que está integrado no Eclipse e fornece uma maneira rápida e fácil de transformar um aplicativo em um Serviço da Web Java e criar stubs de cliente com uma página JSP de teste para fins de teste.

Serviços da Web de SOAP em Java

Estou usando o Eclipse Mars Release (4.5.0) para este tutorial, mas acredito que esses passos funcionarão com versões mais antigas do Eclipse também. Além disso, certifique-se de ter adicionado o Apache Tomcat ou qualquer outro contêiner de servlet como servidor no Eclipse. Vamos começar com a nossa implementação de Serviço da Web Eclipse agora.

Exemplo de Serviço da Web SOAP

Vamos começar com nosso exemplo de serviço da web SOAP no Eclipse. Primeiro, vamos criar um Projeto Web Dinâmico simples no Eclipse que conterá a lógica de negócios para nossa aplicação. Clique no botão Avançar acima e você será direcionado para a próxima página para fornecer o nome do seu projeto da web e o Tempo de Execução Alvo. Observe que estou usando o Apache Tomcat 8, você também pode usar qualquer outro contêiner de servlet padrão. Clique em Avançar e você será solicitado a fornecer o “Contexto Raiz” e a localização do Diretório de Conteúdo. Você pode deixá-los como padrão. Clique em Concluir e o Eclipse criará o esqueleto do projeto para você. Vamos começar com nossa lógica de negócios. Então, para nosso exemplo, gostaríamos de publicar um serviço da web que possa ser usado para adicionar/excluir/obter um objeto. Portanto, o primeiro passo é criar um bean de modelo.

package com.journaldev.jaxws.beans;

import java.io.Serializable;

public class Person implements Serializable{

	private static final long serialVersionUID = -5577579081118070434L;
	
	private String name;
	private int age;
	private int id;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
	@Override
	public String toString(){
		return id+"::"+name+"::"+age;
	}

}

observe que acima está um simples java bean, estamos implementando a interface serializable porque iremos transportá-lo pela rede. também fornecemos a implementação do método tostring que será utilizado quando formos imprimir este objeto no lado do cliente. o próximo passo é criar classes de serviço, então teremos uma interface como personservice e sua classe de implementação simples personserviceimpl.

package com.journaldev.jaxws.service;

import com.journaldev.jaxws.beans.Person;

public interface PersonService {

	public boolean addPerson(Person p);
	
	public boolean deletePerson(int id);
	
	public Person getPerson(int id);
	
	public Person[] getAllPersons();
}

abaixo está a implementação da classe de serviço, estamos usando um map para armazenar objetos person como fonte de dados. na programação do mundo real, gostaríamos de salvá-los em tabelas de banco de dados.

package com.journaldev.jaxws.service;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import com.journaldev.jaxws.beans.Person;

public class PersonServiceImpl implements PersonService {

	private static Map<Integer,Person> persons = new HashMap<Integer,Person>();
	
	@Override
	public boolean addPerson(Person p) {
		if(persons.get(p.getId()) != null) return false;
		persons.put(p.getId(), p);
		return true;
	}

	@Override
	public boolean deletePerson(int id) {
		if(persons.get(id) == null) return false;
		persons.remove(id);
		return true;
	}

	@Override
	public Person getPerson(int id) {
		return persons.get(id);
	}

	@Override
	public Person[] getAllPersons() {
		Set<Integer> ids = persons.keySet();
		Person[] p = new Person[ids.size()];
		int i=0;
		for(Integer id : ids){
			p[i] = persons.get(id);
			i++;
		}
		return p;
	}

}

isso é tudo para a nossa lógica de negócios, uma vez que usaremos isso em um serviço da web, não há necessidade de criar páginas da web aqui. observe que não temos nenhuma referência a qualquer tipo de classes de serviços da web no código acima.

serviços web soap em java usando eclipse

Assim que a lógica do nosso negócio estiver pronta, o próximo passo é usar o Eclipse para criar uma aplicação de serviço web a partir disso. Crie um novo projeto e selecione o assistente de Serviço Web. Clique no botão Avançar e você verá uma página onde os detalhes do serviço web e do cliente devem ser fornecidos. Esta é a página mais importante na criação do serviço web. Certifique-se de selecionar “Tipo de Serviço Web” como “Serviço Web Java de baixo para cima”, pois estamos implementando com uma abordagem de baixo para cima. Existem duas maneiras de criar um serviço web:

  1. Contrato por último ou abordagem de baixo para cima: Nesta abordagem, primeiro criamos a implementação e depois geramos o arquivo WSDL a partir dela. Nossa implementação se encaixa nesta categoria.
  2. Contrato primeiro ou abordagem de cima para baixo: Nesta abordagem, primeiro criamos o contrato de serviço web, ou seja, o arquivo WSDL, e depois criamos a implementação para ele.

Na implementação do serviço, forneça o caminho completamente classificado da classe de implementação PersonServiceImpl. Certifique-se de mover o controle deslizante nos tipos de serviço e cliente para o lado esquerdo, para que ele possa gerar o programa do cliente e também a interface do usuário para testar nosso serviço web. Verifique as configurações na implementação do serviço web, você deve fornecer detalhes corretos para o tempo de execução do servidor, tempo de execução do serviço web e projeto de serviço. Normalmente, eles são preenchidos automaticamente e você não precisa fazer alterações aqui. Para as configurações do cliente, você pode fornecer o nome do projeto do cliente como preferir. Eu o deixei como padrão, SOAPExampleClient. Se clicar no link para o tempo de execução do serviço web, você terá diferentes opções, conforme mostrado na imagem abaixo. No entanto, eu o deixei como o padrão. Clique no botão Avançar e, em seguida, poderá escolher os métodos que deseja expor como serviço web. Você também poderá escolher o estilo do serviço web, seja como documento ou literal. Você pode alterar o nome do documento WSDL, mas é bom tê-lo com o nome da classe de implementação para evitar confusões posteriormente. Clique no botão Avançar e você terá a página de inicialização do servidor, clique no botão “Iniciar servidor” e, em seguida, o botão Avançar será habilitado. Clique no botão Avançar e você terá uma página para iniciar o “Explorador de Serviços Web”. Clique no botão Iniciar e abrirá uma nova janela no navegador onde você pode testar seu serviço web antes de prosseguir com a parte da aplicação do cliente. Parece com a imagem abaixo para o nosso projeto. Podemos fazer alguns testes básicos aqui, mas para nossa aplicação simples, estou pronto para prosseguir com a criação da aplicação do cliente. Clique no botão Avançar na janela popup de serviços web do Eclipse e você terá uma página para a pasta de origem da aplicação do cliente. Clique no botão Avançar e você terá diferentes opções para escolher como instalação de teste. Estou prosseguindo com JAX-RPC JSPs para que a aplicação do cliente gere uma página JSP que podemos usar. Observe os métodos getEndpoint() e setEndpoint(String) adicionados, que podemos usar para obter a URL do ponto de extremidade do serviço web e podemos definí-lo para alguma outra URL, caso movamos nosso servidor para outro ponto de extremidade. Clique no botão Concluir e o Eclipse criará o projeto do cliente em seu espaço de trabalho, também lançará a página de teste do cliente JSP, conforme mostrado abaixo. Você pode copiar a URL e abrir em qualquer navegador que preferir. Vamos testar alguns dos serviços que expusemos e ver a saída.

Teste de Serviço Web SOAP do Eclipse


  • getAllPersons Observe que os detalhes da Pessoa não são impressos na seção de resultados, isso ocorre porque é um código gerado automaticamente e precisamos refatorá-lo um pouco para obter a saída desejada. Abra o Result.jsp no projeto do cliente e você verá que está usando switch case para gerar a saída do resultado. Para o método getAllPersons(), era o caso 42 no meu caso. Note que pode ser totalmente diferente no seu caso. Eu apenas alterei o código para o caso 42, conforme mostrado abaixo.

    case 42:
            gotMethod = true;
            com.journaldev.jaxws.beans.Person[] getAllPersons42mtemp = samplePersonServiceImplProxyid.getAllPersons();
    if(getAllPersons42mtemp == null){
    %>
    <%=getAllPersons42mtemp %>
    <%
    }else{
            String tempreturnp43 = null;
            if(getAllPersons42mtemp != null){
            java.util.List<com.journaldev.jaxws.beans.Person> listreturnp43= java.util.Arrays.asList(getAllPersons42mtemp);
            //tempreturnp43 = listreturnp43.toString();
            for(com.journaldev.jaxws.beans.Person p : listreturnp43){
            	int id = p.getId();
            	int age = p.getAge();
            	String name=p.getName();
            	%>
            	<%=id%>::<%=name %>::<%=age %>
            	<%
            	}
            }
            }      
    break;
    

    Depois disso, obtemos a saída abaixo, observe que o Eclipse está realizando um hot deployment aqui, então não foi necessário redeploy do meu aplicativo.

Parece que nossos aplicativos de serviço da web e cliente estão funcionando bem, certifique-se de dedicar algum tempo para analisar os stubs do lado do cliente gerados pelo Eclipse para entender mais.

WSDL e Configurações do Serviço da Web SOAP

Por fim, você notará que o arquivo WSDL é gerado no projeto de serviço da web como abaixo. Código PersonServiceImpl.wsdl:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="https://service.jaxws.journaldev.com" xmlns:apachesoap="https://xml.apache.org/xml-soap" xmlns:impl="https://service.jaxws.journaldev.com" xmlns:intf="https://service.jaxws.journaldev.com" xmlns:tns1="https://beans.jaxws.journaldev.com" xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="https://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)-->
 <wsdl:types>
  <schema elementFormDefault="qualified" targetNamespace="https://service.jaxws.journaldev.com" xmlns="https://www.w3.org/2001/XMLSchema">
   <import namespace="https://beans.jaxws.journaldev.com"/>
   <element name="addPerson">
    <complexType>
     <sequence>
      <element name="p" type="tns1:Person"/>
     </sequence>
    </complexType>
   </element>
   <element name="addPersonResponse">
    <complexType>
     <sequence>
      <element name="addPersonReturn" type="xsd:boolean"/>
     </sequence>
    </complexType>
   </element>
   <element name="deletePerson">
    <complexType>
     <sequence>
      <element name="id" type="xsd:int"/>
     </sequence>
    </complexType>
   </element>
   <element name="deletePersonResponse">
    <complexType>
     <sequence>
      <element name="deletePersonReturn" type="xsd:boolean"/>
     </sequence>
    </complexType>
   </element>
   <element name="getPerson">
    <complexType>
     <sequence>
      <element name="id" type="xsd:int"/>
     </sequence>
    </complexType>
   </element>
   <element name="getPersonResponse">
    <complexType>
     <sequence>
      <element name="getPersonReturn" type="tns1:Person"/>
     </sequence>
    </complexType>
   </element>
   <element name="getAllPersons">
    <complexType/>
   </element>
   <element name="getAllPersonsResponse">
    <complexType>
     <sequence>
      <element maxOccurs="unbounded" name="getAllPersonsReturn" type="tns1:Person"/>
     </sequence>
    </complexType>
   </element>
  </schema>
  <schema elementFormDefault="qualified" targetNamespace="https://beans.jaxws.journaldev.com" xmlns="https://www.w3.org/2001/XMLSchema">
   <complexType name="Person">
    <sequence>
     <element name="age" type="xsd:int"/>
     <element name="id" type="xsd:int"/>
     <element name="name" nillable="true" type="xsd:string"/>
    </sequence>
   </complexType>
  </schema>
 </wsdl:types>

   <wsdl:message name="addPersonResponse">

      <wsdl:part element="impl:addPersonResponse" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="getAllPersonsResponse">

      <wsdl:part element="impl:getAllPersonsResponse" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="deletePersonResponse">

      <wsdl:part element="impl:deletePersonResponse" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="addPersonRequest">

      <wsdl:part element="impl:addPerson" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="getPersonResponse">

      <wsdl:part element="impl:getPersonResponse" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="getPersonRequest">

      <wsdl:part element="impl:getPerson" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="deletePersonRequest">

      <wsdl:part element="impl:deletePerson" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:message name="getAllPersonsRequest">

      <wsdl:part element="impl:getAllPersons" name="parameters">

      </wsdl:part>

   </wsdl:message>

   <wsdl:portType name="PersonServiceImpl">

      <wsdl:operation name="addPerson">

         <wsdl:input message="impl:addPersonRequest" name="addPersonRequest">

       </wsdl:input>

         <wsdl:output message="impl:addPersonResponse" name="addPersonResponse">

       </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="deletePerson">

         <wsdl:input message="impl:deletePersonRequest" name="deletePersonRequest">

       </wsdl:input>

         <wsdl:output message="impl:deletePersonResponse" name="deletePersonResponse">

       </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="getPerson">

         <wsdl:input message="impl:getPersonRequest" name="getPersonRequest">

       </wsdl:input>

         <wsdl:output message="impl:getPersonResponse" name="getPersonResponse">

       </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="getAllPersons">

         <wsdl:input message="impl:getAllPersonsRequest" name="getAllPersonsRequest">

       </wsdl:input>

         <wsdl:output message="impl:getAllPersonsResponse" name="getAllPersonsResponse">

       </wsdl:output>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="PersonServiceImplSoapBinding" type="impl:PersonServiceImpl">

      <wsdlsoap:binding style="document" transport="https://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="addPerson">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="addPersonRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="addPersonResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="deletePerson">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="deletePersonRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="deletePersonResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="getPerson">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="getPersonRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="getPersonResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

      <wsdl:operation name="getAllPersons">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="getAllPersonsRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="getAllPersonsResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="PersonServiceImplService">

      <wsdl:port binding="impl:PersonServiceImplSoapBinding" name="PersonServiceImpl">

         <wsdlsoap:address location="https://localhost:8080/SOAPExample/services/PersonServiceImpl"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions>

Se você abrir no modo de design no Eclipse, parecerá com a imagem abaixo. Você também pode acessar o arquivo WSDL do serviço da web através do navegador, adicionando ?wsdl ao ponto de extremidade do serviço da web. Você também notará que o web.xml foi modificado para usar o Apache Axis como controlador frontal para o serviço da web.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>SOAPExample</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <display-name>Apache-Axis Servlet</display-name>
    <servlet-name>AxisServlet</servlet-name>
    <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>*.jws</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
  <servlet>
    <display-name>Axis Admin Servlet</display-name>
    <servlet-name>AdminServlet</servlet-name>
    <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
    <load-on-startup>100</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>AdminServlet</servlet-name>
    <url-pattern>/servlet/AdminServlet</url-pattern>
  </servlet-mapping>
</web-app>

A imagem abaixo mostra o serviço da web e o projeto do cliente com todos os stubs gerados automaticamente e páginas JSP para testar o serviço da web. Isso é tudo para os web services de SOAP em Java usando o Eclipse, como você pode ver, toda a parte difícil foi feita automaticamente pelo Eclipse e todo o nosso foco foi escrever a lógica de negócios para nosso serviço da web.

Source:
https://www.digitalocean.com/community/tutorials/soap-webservices-in-java-example-eclipse