Автор оригинала: 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 Map persons = 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.