В этой главе вы узнаете, как разработать простое веб-приложение, которое отправит приветственное сообщение пользователю. Проект веб-сервиса использует модель WSDL . CXF позволяет скрыть эту модель WSDL, предоставляя простой интерфейс для сопоставления API-интерфейсов Apache CXF с базовым WSDL.
В этом простейшем проекте интерфейс веб-службы будет напрямую предоставлен клиенту, и клиент будет использовать собственные API-интерфейсы Apache CXF для вызова веб-службы.
Сначала мы создадим веб-сервис. Каждый сервис имеет интерфейс, доступный клиенту. Мы можем написать этот интерфейс как простой интерфейс Apache CXF или как документ WSDL. В этом подходе Apache CXF-First мы представим наш сервис через интерфейс Apache CXF.
Разработка веб-сервиса
Сервис, который мы собираемся создать в сети, будет иметь единый веб-метод, который называется greetings . Метод принимает аргумент строкового типа, в котором мы будем отправлять имя пользователя. Служба отправит обратно приветственное сообщение звонящему с полученным именем пользователя, включенным в сообщение.
Интерфейс веб-службы
Чтобы представить интерфейс нашего веб-сервиса, мы создадим интерфейс Apache CXF следующим образом:
//HelloWorld.java package com.tutorialspoint.cxf.pojo; public interface HelloWorld { String greetings(String text); }
Интерфейс имеет только один метод с именем приветствия . Сервер будет реализовывать этот интерфейс. В нашем простом приложении этот интерфейс напрямую предоставляется клиенту. Как правило, в приложении веб-службы вы используете WSDL для описания интерфейса веб-службы. В этом простом приложении мы предоставим этот прямой интерфейс клиентскому разработчику. Затем клиент вызовет приветственное сообщение на объекте сервера. Итак, сначала давайте создадим веб-сервис.
Реализация веб-сервиса
Интерфейс HelloWorld реализован в классе HelloWorldImpl Apache CXF, как показано ниже —
//HelloWorldImpl.java package com.tutorialspoint.cxf.pojo; public class HelloWorldImpl implements HelloWorld { @Override public String greetings(String text) { return "Hi " + text; } }
Метод greetings получает параметр строкового типа, добавляет его к приветственному сообщению и возвращает результирующую строку вызывающей стороне.
Далее мы пишем серверное приложение для размещения сервиса HelloWorld .
Создание сервера
Серверное приложение состоит из двух частей —
-
Первая часть создает фабрику для нашего веб-сервиса, и
-
Вторая часть описывает основной метод для его создания.
Первая часть создает фабрику для нашего веб-сервиса, и
Вторая часть описывает основной метод для его создания.
Сервер использует класс ServerFactoryBean, предоставляемый библиотеками CXF, для предоставления нашего интерфейса HelloWorld удаленным клиентам. Таким образом, мы сначала создаем экземпляр класса ServerFactoryBean, а затем устанавливаем его различные свойства —
ServerFactoryBean factory = new ServerFactoryBean();
Мы устанавливаем класс сервиса, который будет вызываться путем вызова метода setServiceClass объекта фабрики —
factory.setServiceClass(HelloWorld.class);
Мы устанавливаем URL для вызова нашего сервиса, вызывая фабричный метод setAddress . Обратите внимание, что сервис будет опубликован по этому URL.
factory.setAddress("http://localhost:5000/Hello");
В этом случае служба развернута на встроенном сервере и будет прослушивать порт 5000. Вы можете выбрать любой номер порта по вашему выбору.
Перед созданием фабрики необходимо рассказать фабрике о классе реализации нашего сервиса. Это делается путем вызова метода setServiceBean для объекта фабрики, как показано здесь —
factory.setServiceBean(new HelloWorldImpl());
Сервисный компонент устанавливается на экземпляр нашего класса реализации сервиса. Наконец, мы создаем фабрику, вызывая ее метод создания —
factory.create();
Теперь, когда мы разработали фабрику для запуска нашего веб-сервиса, мы напишем метод main для его создания и продолжения работы в течение некоторого времени.
Теперь напишите основной метод для создания экземпляра класса HelloServer следующим образом:
public static void main(String[] args) throws Exception { new HelloServer(); System.out.println("Listening on port 5000 ..."); }
После создания класс HelloServer будет работать бесконечно долго. Для производственных развертываний ваш сервер будет работать вечно. В текущей ситуации мы завершаем работу сервера через заданное время следующим образом:
Thread.sleep(5 * 60 * 1000); System.out.println("Server exiting ..."); System.exit(0);
Весь код для класса HelloServer приведен ниже —
//HelloServer.java
//HelloServer.java package com.tutorialspoint.cxf.pojo; import org.apache.cxf.frontend.ServerFactoryBean; public class HelloServer { protected HelloServer() throws Exception { ServerFactoryBean factory = new ServerFactoryBean(); factory.setServiceClass(HelloWorld.class); factory.setAddress("http://localhost:5000/Hello"); factory.setServiceBean(new HelloWorldImpl()); factory.create(); } public static void main(String[] args) throws Exception { new HelloServer(); System.out.println("Listening on port 5000 ..."); Thread.sleep(5 * 60 * 1000); System.out.println("Server exiting ..."); System.exit(0); } }
Созданное нами серверное приложение использует класс ServerFactoryBean из библиотек CXF. Теперь мы должны включить эти библиотеки в наш проект, чтобы успешно скомпилировать класс HelloServer . Мы будем использовать Maven для настройки зависимостей проекта.
Настройка проекта Maven
Чтобы создать проект Maven, введите следующую команду в окне командной строки. Обратите внимание, что мы проверили это на компьютере Mac. Для установок Windows и Linux инструкции могут отличаться в нескольких местах.
mvn archetype:generate
Когда спросят о свойствах, введите следующие значения —
Define value for property 'groupId': : com.tutorialspoint Define value for property 'artifactId': : cxf-pojo Define value for property 'version': 1.0-SNAPSHOT: : 1.0 Define value for property 'package': com.tutorialspoint: : com.tutorialspoint.cxf.pojo
После завершения команды maven вы найдете соответствующую структуру папок, созданную в вашей текущей папке вместе с файлом pom.xml.
Сгенерированная структура каталогов показана здесь —
Вы добавите зависимости CXF в файл pom.xml, а также скопируете созданные выше файлы Apache CXF в соответствующую папку созданной maven структуры. Для вашей справки мы дали ниже файл 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>com.tutorialspoint</groupId> <artifactId>cxf-pojo</artifactId> <version>1.0</version> <packaging>jar</packaging> <profiles> <profile> <id>server</id> <build> <defaultGoal>test</defaultGoal> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass> com.tutorialspoint.cxf.pojo.HelloServer </mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> <profile> <id>client</id> <build> <defaultGoal>test</defaultGoal> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <phase>test</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass> com.tutorialspoint.cxf.pojo.HelloClient </mainClass> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-features-logging</artifactId> <version>3.3.0</version> <type>jar</type> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-simple</artifactId> <version>3.3.0</version> <type>jar</type> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.3.0</version> </dependency> <!-- Jetty is needed if you're using the CXFServlet --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version>3.3.0</version> </dependency> </dependencies> <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> </project>
Приведенный выше файл pom.xml может включать дополнительные зависимости, которые не имеют отношения к этому проекту, но необходимы для нашего следующего проекта в этом руководстве. Во всяком случае, нет никакого вреда как такового в том числе дополнительных зависимостей.
Структура папки проекта
Структура папок проекта на моем компьютере после размещения файлов сервера и клиента Apache CXF показана ниже для краткого ознакомления.
Запущенный сервер
Чтобы построить проект, используйте следующую команду в окне командной строки:
mvn clean install
Вы можете запустить сервер, используя следующую команду —
mvn -Pserver
Это запустит сервер, и вы увидите следующее приглашение на консоли —
INFO: Creating Service {http://pojo.cxf.tutorialspoint.com/}HelloWorld from class com.tutorialspoint.cxf.pojo.HelloWorld INFO: Setting the server's publish address to be http://localhost:5000/Hello Listening on port 5000 ...
Теперь в окне вашего браузера укажите URL нашего опубликованного сервиса. Вы увидите следующий вывод —
Это подтверждает, что наш сервис работает на указанном порту на локальном хосте. Поскольку мы не указали приветственное сообщение в нашем вызове, сообщение об ошибке SOAP возвращается в браузер.
Вы можете дополнительно протестировать свой веб-сервис, используя выбранный клиент SOAP. Здесь мы использовали Почтальон для тестирования нашего сервера.
Вывод как показано здесь —
Обратите внимание, что SOAP-запрос был закодирован вручную. После публикации запроса сервер отправил ответное сообщение SOAP , которое видно в нижней части снимка экрана.
Из этого вы можете понять, что CXF поддерживает использование протоколов SOAP как для запросов, так и для ответов, одновременно предоставляя вам единое представление о различных веб-технологиях, существующих в современном мире. Это значительно упрощает разработку веб-приложений.
Наша следующая задача — создать клиент, который будет использовать созданный вами веб-сервис.
Создание клиента
В серверном приложении HelloWorld есть интерфейс, который предоставляет наш веб-сервис. Сам веб-сервис просто предоставляет клиенту простое приветственное сообщение. Обычно интерфейс веб-службы открыт для внешнего мира с использованием WSDL (языка описания веб-служб). В этом тривиальном приложении мы представим клиенту наш веб-сервис, предоставив непосредственно интерфейс сервиса, и это HelloWorld.class .
Для этой цели CXF предоставляет класс фабрики ClientProxyFactoryBean, который позволяет нам подключаться к желаемому интерфейсу к созданному экземпляру фабрики.
Сначала мы создаем экземпляр фабричного компонента следующим образом:
ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
Мы вызываем метод setAddress для экземпляра фабричного компонента, чтобы установить URL-адрес, по которому может быть вызван наш веб-сервис. В нашем случае мы будем использовать URL-адрес, использованный при создании сервера на нашем предыдущем шаге —
factory.setAddress("http://localhost:5000/Hello");
Затем мы вызываем метод create для экземпляра фабрики, чтобы присоединить к нему наш интерфейс службы HelloWorld.class .
HelloWorld helloServer = factory.create(HelloWorld.class);
Наконец, мы вызываем метод приветствия для вызова удаленного веб-сервиса.
System.out.println(helloServer.greetings(System.getProperty("user.name")));
Это напечатало бы приветственное сообщение на вашей консоли.
Весь исходный код клиентского приложения показан ниже —
//HelloClient.java package com.tutorialspoint.cxf.pojo; import org.apache.cxf.frontend.ClientProxyFactoryBean; public class HelloClient { public static void main(String[] args) throws Exception { ClientProxyFactoryBean factory = new ClientProxyFactoryBean(); factory.setAddress("http://localhost:5000/Hello"); HelloWorld helloServer = factory.create(HelloWorld.class); System.out.println(helloServer.greetings(System.getProperty("user.name"))); } }
Бегущий клиент
Убедитесь, что сервер все еще работает на вашем компьютере. В случае, если истекло время ожидания, перезапустите сервер с помощью следующей команды —
mvn -Pserver
Вы увидите следующее сообщение на консоли —
Listening on port 5000 ...
Теперь, до истечения времени ожидания сервера, которое мы установили на 5 минут, откройте другое окно командной строки и запустите клиент с помощью следующей команды —
mvn -Pclient
В командной строке вы увидите сообщение, подобное следующему:
Hi tutorialspoint
Обратите внимание, что tutorialspoint — это наше имя пользователя. Вы получите приветствие со своим именем.
В следующей главе мы узнаем, как использовать CXF в проекте JAX-WS (API Apache CXF для веб-служб XML).