Автор оригинала: Pankaj Kumar.
Мы узнали, как использовать JAX-WS для создания веб-служб SOAP и публиковать их с помощью javax.xml.ws.Endpoint
но в большинстве случаев мы хотим развернуть наши службы в контейнере сервлетов. Итак, сегодня мы узнаем, как создать веб-службу и развернуть ее на сервере Apache Tomcat, а затем протестировать ее с помощью клиентского приложения.
Для этого нашим первым шагом является создание динамического веб-проекта для написания нашей бизнес-логики. Наш окончательный проект будет выглядеть так, как показано на рисунке ниже.
Для развертывания веб-службы JAX-WS в контейнере сервлетов нам необходимо добавить в него несколько файлов jar. Есть два способа сделать это.
- Загрузите файлы jar с https://jax-ws.java.net/ и включить его в динамический веб-проект.
- Преобразуйте динамический веб-проект в Maven и добавьте приведенные ниже зависимости.
Это автоматически загрузит все необходимые файлы jar в виде зависимостей maven, показанных на рисунке ниже. Мне нравится этот подход, потому что я могу легко обновить версии, а также убедиться, что ни одна из банок не пропущена.
Теперь давайте рассмотрим бизнес – логику. Во-первых, мы создадим класс компонентов модели.
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; } }
Теперь мы создадим наш интерфейс сервиса и классы реализации.
package com.journaldev.jaxws.service; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import com.journaldev.jaxws.beans.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(); }
package com.journaldev.jaxws.service; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.jws.WebService; import com.journaldev.jaxws.beans.Person; @WebService(endpointInterface = "com.journaldev.jaxws.service.PersonService") public class PersonServiceImpl implements PersonService { private static Mappersons = new HashMap (); @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 ids = persons.keySet(); Person[] p = new Person[ids.size()]; int i=0; for(Integer id : ids){ p[i] = persons.get(id); i++; } return p; } }
Наш код веб-службы готов, необходимы следующие шаги для его создания в виде веб-архива, который мы можем развернуть в контейнере сервлетов.
JAXWS-Tomcat com.sun.xml.ws.transport.http.servlet.WSServletContextListener JAXWSServlet com.sun.xml.ws.transport.http.servlet.WSServlet 1 JAXWSServlet /personWS 30
В этом нет ничего специфичного для проекта, это общие изменения для добавления класса прослушивателя и класса frontserv для веб-службы.
Следующий шаг-создать sun-jaxws.xml
файл внутри каталога WEB-INF, в котором мы предоставим сведения о конечной точке. URL-шаблон должен быть таким же, как определено в web.xml файл.
Следующий шаг-создать || sun-jaxws.xml || файл внутри каталога WEB-INF, в котором мы предоставим сведения о конечной точке. URL-шаблон должен быть таким же, как определено в web.xml файл.
Вот и все, мы закончили. Просто экспортируйте проект в виде файла WAR и разверните его в контейнере tomcat. Перейдите по URL-адресу веб-службы, как показано на рисунке ниже.
Перейдите по URL-адресу WSDL и обратите внимание на атрибуты targetNamespace и имя , мы будем использовать их в программе на стороне клиента.
Ниже приведена простая тестовая программа для использования нашего веб-сервиса и выполнения некоторых тестов.
package com.journaldev.jaxws.test; import java.net.MalformedURLException; import java.net.URL; import java.util.Arrays; import javax.xml.namespace.QName; import javax.xml.ws.Service; import com.journaldev.jaxws.beans.Person; import com.journaldev.jaxws.service.PersonService; public class SOAPPublisherClient { public static void main(String[] args) throws MalformedURLException { URL wsdlURL = new URL("https://localhost:8080/JAXWS-Tomcat/personWS?wsdl"); //check above URL in browser, you should see WSDL file //creating QName using targetNamespace and name QName qname = new QName("https://service.jaxws.journaldev.com/", "PersonServiceImplService"); Service service = Service.create(wsdlURL, qname); //We need to pass interface and model beans to client PersonService ps = service.getPort(PersonService.class); Person p1 = new Person(); p1.setName("Pankaj"); p1.setId(1); p1.setAge(30); Person p2 = new Person(); p2.setName("Meghna"); p2.setId(2); p2.setAge(25); //add person System.out.println("Add Person Status="+ps.addPerson(p1)); System.out.println("Add Person Status="+ps.addPerson(p2)); //get person System.out.println(ps.getPerson(1)); //get all persons System.out.println(Arrays.asList(ps.getAllPersons())); //delete person System.out.println("Delete Person Status="+ps.deletePerson(2)); //get all persons System.out.println(Arrays.asList(ps.getAllPersons())); } }
Как объяснено в предыдущем уроке , мы можем использовать утилиту wsimport для создания заглушек клиентов и использования ее. Когда мы запускаем вышеуказанную программу, мы получаем результат, как показано на рисунке ниже.
На данный момент это все, я надеюсь, что вам понравился учебник, и он поможет вам в развертывании веб-служб в контейнере Tomcat.