Serviços da Web SOAP em Java podem ser desenvolvidos de várias maneiras. Aprendemos sobre os Serviços da Web SOAP JAX-WS em nosso último tutorial, hoje aprenderemos como podemos criar um serviço da web SOAP e seu programa cliente usando o Eclipse. Aqui não vamos usar o JAX-WS, vamos usar o 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 SOAP em Java
Estou usando o Eclipse Mars Release (4.5.0) para este tutorial, mas acredito que essas etapas funcionarão com versões mais antigas do Eclipse também. Certifique-se também de ter adicionado o Apache Tomcat ou qualquer outro contêiner de servlet como servidor no Eclipse. Vamos começar com nossa implementação de Serviço da Web do Eclipse agora.
Exemplo de Serviço da Web SOAP
Vamos começar com o nosso exemplo de serviço web SOAP no Eclipse. Em primeiro lugar, vamos criar um Projeto Web Dinâmico simples no Eclipse que conterá a lógica de negócios para a nossa aplicação. Clique no botão Próximo acima e você será direcionado para a próxima página para fornecer o nome do seu projeto web e o Tempo de Execução Alvo. Note que estou usando o Apache Tomcat 8, mas você também pode usar qualquer outro container de servlet padrão.
Clique em Próximo e será solicitado a fornecer o “Contexto Raiz” e o local 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 a nossa lógica de negócios. Então, para o nosso exemplo, gostaríamos de publicar um serviço web que possa ser usado para adicionar/excluir/obter um objeto. Então, 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 há um bean Java simples, estamos implementando a interface Serializable porque iremos transportá-lo pela rede. Também fornecemos uma implementação do método toString que será usada ao imprimir este objeto no lado do cliente. O próximo passo é criar classes de serviço, então teremos uma interface chamada PersonService e uma classe de implementação simples chamada 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 nossa lógica de negócio, já que vamos usar isso em um serviço da web, não faz sentido criar páginas da web aqui. Observe que não temos referência a nenhum tipo de classe de serviço da web no código acima.
Serviços da Web SOAP em Java usando o Eclipse
Assim que nossa lógica de negócios estiver pronta, o próximo passo é usar o Eclipse para criar uma aplicação de serviço da web a partir disso. Crie um novo projeto e selecione o assistente de Serviço da Web. Clique no botão Avançar e você terá uma página onde os detalhes do serviço da web e do cliente devem ser fornecidos. Esta é a página mais importante na criação de um serviço da web. Certifique-se de selecionar “Tipo de Serviço da Web” como “Serviço da Web de Bean Java de baixo para cima”, pois estamos implementando com abordagem de baixo para cima. Existem duas maneiras de criar um serviço da web:
- 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.
- Contrato primeiro ou abordagem de cima para baixo: Nesta abordagem, primeiro criamos o contrato do serviço da web, ou seja, o arquivo WSDL e depois criamos a implementação para ele.
Na implementação do serviço, forneça o caminho totalmente classificado da classe de implementação
PersonServiceImpl
. Certifique-se de mover o controle deslizante no tipo de serviço e cliente para o lado esquerdo para que possa gerar o programa cliente e também a interface do usuário para testar nosso serviço da web. Verifique as configurações na implementação do serviço da web, você deve fornecer os detalhes corretos para o tempo de execução do servidor, tempo de execução do serviço da web e projeto de serviço. Geralmente, eles são preenchidos automaticamente e você não precisa fazer nenhuma alteração aqui. Para configurações de cliente, você pode fornecer o nome do projeto cliente como desejar. Deixei-o como padrão SOAPExampleClient
. Se você clicar no link para o tempo de execução do serviço da web, obterá diferentes opções conforme mostrado na imagem abaixo. No entanto, eu o deixei como o padrão. Clique no botão Avançar e então você poderá escolher os métodos que deseja expor como serviço da web. Você também poderá escolher o estilo do serviço da web 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ão posteriormente.
Clique no botão Avançar e você receberá a página de inicialização do servidor, clique no botão “Iniciar servidor” e então o próximo botão será habilitado.
Clique no botão Avançar e você receberá uma página para iniciar o “Explorador de Serviços da Web”.
Clique no botão Iniciar e ele abrirá uma nova janela no navegador onde você pode testar seu serviço da web antes de avançar com a parte do aplicativo cliente. Parece com a imagem abaixo para nosso projeto.
Podemos fazer alguns testes de sanidade aqui, mas para nossa aplicação simples estou pronto para avançar com a criação do aplicativo cliente. Clique no botão Avançar na janela popup de serviços da web do Eclipse e você receberá uma página para a pasta de origem do aplicativo cliente.
Clique no botão Avançar e você receberá diferentes opções para escolher como instalação de teste. Estou seguindo em frente com JSPs JAX-RPC para que o aplicativo cliente gere uma página JSP que possamos usar.
Observe os métodos
getEndpoint()
e setEndpoint(String)
adicionados que podemos usar para obter o URL do endpoint do serviço da web e podemos defini-lo para algum outro URL no caso de movermos nosso servidor para algum outro endpoint URL. Clique no botão Concluir e o Eclipse criará o projeto 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 o URL e abrir em qualquer navegador que desejar. Vamos testar alguns dos serviços que expusemos e ver a saída.
Teste de Serviço Web SOAP Eclipse
-
getAllPersons
Repare que os detalhes da Pessoa não são impressos na seção de resultados, isso ocorre porque o 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 verá que está usando um switch case para gerar a saída do resultado. Para o método getAllPersons(), foi 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 seguinte saída, observe que o Eclipse está fazendo uma implantação rápida aqui, então não precisei redeployar minha aplicação.
Parece que nossos serviços da web e aplicações do 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
Finalmente, você notará que o arquivo WSDL é gerado no projeto do serviço da web conforme 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 é 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 todas as classes geradas automaticamente e páginas JSP para testar o serviço da web.
Isso é tudo para os serviços da web SOAP em Java usando o Eclipse. Como você pode ver, toda a parte difícil foi feita automaticamente pelo Eclipse, e todo nosso foco estava em 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