Olá, estou aprendendo a usar web-services e parei com um problema, talvez seja algo bobo, mas não achei solução, estou hospedando minha aplicação no Heroku e deixarei aqui as informações relevantes, porém antes devo explicar o que eu gostaria de fazer:
Fiz alguns testes simples de calculadoras e deu certo, porém quando tentei avançar um pouco nos exemplos, algo deu muito errado, minha intenção é que eu possa trabalhar com objetos, com isso eu poderei trabalhar com o banco de dados junto, mas não estou conseguindo, uma ultima tentativa foi este tutorial onde basicamente fiz uma copia do mesmo sem alterações, pois se o exemplo funciona então eu poderia ver onde estava o meu erro.
Deixo agora o meu código e o erro que segue usando este mesmo exemplo:
No servidor:
Person.java
package ws.basico.ws_basico.model; 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: "+id+", nome: "+name+", idade: "+age; } }
PersonService.java
package ws.basico.ws_basico.interfaces; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import ws.basico.ws_basico.model.Person; @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public interface PersonService { @WebMethod public boolean addPerson(Person p); @WebMethod public boolean deletePerson(int id); @WebMethod public Person getPerson(int id); @WebMethod public Person[] getAllPersons(); }
PersonServiceImpl.java
package ws.basico.ws_basico.controller.services; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.jws.WebService; import ws.basico.ws_basico.interfaces.PersonService; import ws.basico.ws_basico.model.Person; @WebService(endpointInterface = "ws.basico.ws_basico.interfaces.PersonService", serviceName = "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; } }
Loader.java
package ws.basico.ws_basico; import javax.xml.ws.Endpoint; import ws.basico.ws_basico.controller.services.PersonServiceImpl; public class Loader { public static void main(String[] args) { String port = System.getenv("PORT"); String host = "http://0.0.0.0:"; String service = "/person"; String url = host + port + service; SorteiaMensagem sm = new SorteiaMensagem(); Endpoint.publish(url, new PersonServiceImpl()); } }
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ws.basico</groupId> <artifactId>ws_basico</artifactId> <version>1.0</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>ws.basico.ws_basico.Loader</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
Aqui tem o WSDL gerado por este código. Estou gerando e passando a aplicação para o heroku usando o Maven com os seguintes comandos:
mvn package git add. git commit -m "texto aqui" git push heroku master
Creio não haver nada de diferente nos comandos git e nem na compilação do Maven, pois o sistema esta rodando no servidor, como pode ser visto no link acima.
Porém ao rodar um client é que encontra-se o erro.
Código do client:
PersonService.java
package ws_basico_consumidor.interfaces; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import ws_basico_consumidor.model.Person; @WebService(name = "Person", targetNamespace = "http://ws_basico.basico.ws/") public interface PersonService { public boolean addPerson(Person p); public boolean deletePerson(int id); public Person getPerson(int id); public Person[] getAllPersons(); }
Ws_basico_consumidor.java
package ws_basico_consumidor; import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import ws_basico_consumidor.model.Person; import ws_basico_consumidor.interfaces.PersonService; import java.util.Arrays; public class Ws_basico_consumidor { public static void main(String[] args) throws MalformedURLException { PersonService ps; Person p1 = new Person(); Person p2 = new Person(); URL url = new URL("https://ws-basico.herokuapp.com/person?wsdl"); QName qname = new QName("ws.basico.ws_basico.interfaces.PersonService","Person"); Service ws = Service.create(url, qname); ps = ws.getPort(PersonService.class); p1.setId(0); p1.setName("bruno"); p1.setAge(27); p2.setId(1); p2.setName("ana"); p2.setAge(19); System.out.println("Adicionando " + p1.getName() + " status: " + ps.addPerson(p1)); System.out.println("Adicionando " + p2.getName() + " status: " + ps.addPerson(p2)); System.out.println(ps.getPerson(0)); // retorna o bruno. System.out.println(Arrays.asList(ps.getAllPersons())); System.out.println("Deletando " + p2.getName() + " status: " + ps.deletePerson(1)); System.out.println(Arrays.asList(ps.getAllPersons())); } }
Então eu tenho o seguinte erro no client:
Exception in thread “main” javax.xml.ws.WebServiceException: {ws.basico.ws_basico.interfaces.PersonService}Person não é um serviço válido. Os serviços válidos são {http://services.controller.ws_basico.basico.ws/}Person at com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:310) at com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:215) at com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:196) at com.sun.xml.internal.ws.client.WSServiceDelegate.(WSServiceDelegate.java:192) at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:104) at javax.xml.ws.Service.(Service.java:77) at javax.xml.ws.Service.create(Service.java:707) at ws_basico_consumidor.Ws_basico_consumidor.main(Ws_basico_consumidor.java:23) C:\Users\bruno\AppData\Local\NetBeans\Cache.2\executor-snippets\run.xml:53: Java returned: 1 FALHA NA CONSTRUÇÃO (tempo total: 12 segundos)
Considerações:
- Antes de mais nada, sei que por padrão não se usa underline em nomenclatura Java, mas na hora estava mais preocupado em testar e diferenciar dos outros projetos, apenas isso.
- Na classe “Loader” ela esta deixando a cargo do sistema em definir sua localização e porta, se não me engano a porta padrão do Heroku é a 5000.
Desde já agradeço pela atenção.