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.
Исходный код
157 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 просто нет. Вы пробовали компилировать проект перед загрузкой в репозиторий?
Разумеется на момент написания всё работало, но это было более пяти лет назад..