SOAP java веб сервис. Пример Hello World example
Пример Java web-service с использованием технологии SOAP.
Используемые технологии и библиотеки
- Apache CXF 3.1.6
- Spring MVC 4.3.0.Release
1. Описание задачи
Создать простейший веб-сервис с использованием технологии SOAP. Написать простой класс веб сервиса на стороне сервера и обратиться к нему с помощью кода клиентской части.
2. Структура проекта
Создан один класс, описывающий SOAP веб-сервис (HelloSoap). Для демонстрации вывода Java объекта в xml формате используются два класса (Goods, Document). Для обращение к SOAP веб-сервису была написана простая клиентская часть, которая описана в классе JavaStudyWS.
3. pom.xml
Для реализации веб-сервиса используется библиотека Apache CXF.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
<?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>ru.javastudy</groupId> <artifactId>javastudy_webservices</artifactId> <version>1.0</version> <properties> <java.version>1.8</java.version> <spring-framework.version>4.3.0.RELEASE</spring-framework.version> <cxf-rt-frontend-jaxws.version>3.1.6</cxf-rt-frontend-jaxws.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${spring-framework.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>${cxf-rt-frontend-jaxws.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>${cxf-rt-frontend-jaxws.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <groupId>org.apache.maven.plugins</groupId> <version>3.3</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> </plugins> </build> </project> |
4. web.xml
Библиотека Spring MVC используется исключительно для запуска приложения и удобного описания SOAP веб-сервиса. Использование Spring не является обязательным и приложение запускается с помощью небольшого метода с публикацией soap сервиса. Файл с настройками application-context.xml (с описанием SOAP веб-сервиса) добавлен в дескриптор развертывания. Так же был добавлен mvc-config.xml (не используется) в параметры инициализации init-param диспетчера сервлетов, чтобы приложение не ругалось на отсутствие файла с настройками (dispatcher-servlet.xml).
web.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.form</url-pattern> </servlet-mapping> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/soap/*</url-pattern> </servlet-mapping> </web-app> |
Для реализации веб-сервиса используется реализация JAX-WS API — Apache CXF. Создан сервлет и задан шаблон URL по которому он будет срабатывать (/soap/*).
5. application-context.xml
В файле конфигурации спринг описывается один soap веб сервис — его id, адрес и реализующий класс.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <!--http://localhost:8080/soap/webserviceSEI?wsdl--> <jaxws:endpoint id="webserviceSEI" address="/webserviceSEI" implementor="ru.javastudy.ws.soap.HelloSoap"/> </beans> |
Здесь прописан веб сервис с id = helloRestService. Он будет доступен по ссылке, которая формируется из пути сервера + маппинг сервлета + адреса обработки сервиса (в данном случае совпадает с id).
6. SOAP сервис
Был создан простейший веб сервис по технологии SOAP.
Описание SOAP веб-сервиса находится в интерфейсе WebserviceSEI (service endpoint interface). Аннотация @WebMethod не является обязательной, но в ней можно прописывать дополнительные параметры и свойства для веб-сервиса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package ru.javastudy.ws.soap; import ru.javastudy.ws.model.Goods; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; /** * Created for JavaStudy.ru on 11.06.2016. */ /** * The @WebService annotation on the implementation class lets CXF know which * interface to use when creating WSDL. In this case its simply our HelloWorld interface. */ @WebService public interface WebserviceSEI { @WebMethod//annotation optional and is mainly used to provide a name attribute to the public method in wsdl String testService(); @WebMethod String sayHelloTo(@WebParam(name = "text") String text); @WebMethod Goods getGoods(); } |
Реализация находится в классе HelloSoap:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package ru.javastudy.ws.soap; import ru.javastudy.ws.model.Goods; import javax.jws.WebService; /** * Created for JavaStudy.ru on 10.06.2016. */ @WebService(endpointInterface = "ru.javastudy.ws.soap.WebserviceSEI", serviceName = "HelloSoap") public class HelloSoap implements WebserviceSEI { @Override public String testService() { return "Hello from SOAP Webservice!"; } @Override public String sayHelloTo(String text) { return "Hello to " + text; } @Override public Goods getGoods() { Goods goods = new Goods(); goods.setId(1); goods.setName("Some goods test name"); return goods; } } |
В аннотации указан интерфейс, которые описывает веб-сервис, а также имя этого сервиса. Реализованы тривиальные методы, которые позволят продемонстрировать работу soap сервиса.
7. Модель данных
Созданы два демонстрационных класса, которые будут преобразовываться в xml формат и передаваться клиенту. У классов задана аннотация @XmlRootElement с помощью которой присваивается имя для корневого xml элемента в ответе (см. далее запуск приложения).
Goods:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package ru.javastudy.ws.model; import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; /** * Created for JavaStudy.ru on 11.06.2016. */ @XmlRootElement(name = "goods") public class Goods implements Serializable { private int id; private String name; public Goods() { } public Goods(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Goods{" + "id=" + id + ", name='" + name + '\'' + '}'; } } |
Document:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package ru.javastudy.ws.model; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; /** * Created for JavaStudy.ru on 12.06.2016. */ @XmlRootElement(name = "document") public class Document { private int id; private String name; private List<Goods> goodsList; public Document() { } public Document(int id, String name, List<Goods> goodsList) { this.id = id; this.name = name; this.goodsList = goodsList; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Goods> getGoodsList() { return goodsList; } public void setGoodsList(List<Goods> goodsList) { this.goodsList = goodsList; } } |
8. SOAP клиент
Для тестирования нашего сервиса был создан код, имитирующий клиентскую сторону.
JavaStudyWS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package ru.javastudy.ws.main; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import ru.javastudy.ws.model.Goods; import ru.javastudy.ws.soap.WebserviceSEI; /** * Created for JavaStudy.ru on 09.06.2016. */ public class JavaStudyWS { public static void main(String[] args) { testSOAPFromClient(); } /** * create client and test soap service */ private static void testSOAPFromClient() { String soapServiceUrl = "http://localhost:8080/soap/webserviceSEI"; JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean(); factoryBean.setServiceClass(WebserviceSEI.class); factoryBean.setAddress(soapServiceUrl); WebserviceSEI webserviceSEI = (WebserviceSEI) factoryBean.create(); Goods result = webserviceSEI.getGoods(); System.out.println("Result: " + result); } } |
С помощью фабрики JaxWsProxyFactoryBean создается soap веб-сервис доступные по адресу soapServiceURL. Далее вызвается один из методов, описанных в интерфейсе сервиса.
9. Запуск веб сервиса
После запуска веб сервиса его описание можно посмотреть по ссылке http://localhost:8080/soap/webserviceSEI?wsdl.
Если запустить main метод класса JavaStudyWS, то мы увидим ответ веб-сервиса в консоли.
1 |
Result: Goods{id=1, name='Some goods test name'} |
9.1 SoapUI
SOAP веб-сервисы удобно тестировать с помощью утилиты SoapUI.
Добавляем новый SOAP проект.
Указываем путь к wsdl описанию нашего сервиса.
Запускаем метод веб-сервиса.
Таким образом можно создать простейший SOAP веб сервис java.
Исходный код
7 thoughts on “SOAP java веб сервис. Пример Hello World example”
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
«Для реализации веб-сервиса используется реализация Jax-RS API — Apache CXF. Создан сервлет и задан шаблон URL по которому он будет срабатывать (/rest/*).» — наверное, ошибка копи паста из примера рестфул вс.
именно так)
Не работает. Запускаю, а мне в ответ
Caused by: java.net.ConnectException: ConnectException invoking http://localhost:8080/soap/webserviceSEI: Connection refused: connect
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
Из всего стектрейса ясно что проблема с
Caused by: java.net.ConnectException: ConnectException invoking http://localhost:8080/soap/webserviceSEI: Connection refused: connect
А что в файле mvc—config.xml? без него не запускается
18-May-2017 22:16:06.335 SEVERE [localhost-startStop-1] org.springframework.web.context.ContextLoader.initWebApplicationContext Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/config/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/config/applicationContext.xml]
Никогда не понимал, в чем прикол выкладывать нерабочие проекты? Половины зависимостей в pom.xml просто нет. Вы пробовали компилировать проект перед загрузкой в репозиторий?
Разумеется на момент написания всё работало, но это было более пяти лет назад..