Учебники

Apache CXF с POJO

В этой главе вы узнаете, как разработать простое веб-приложение, которое отправит приветственное сообщение пользователю. Проект веб-сервиса использует модель 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).