POJOを使用したApacheCXF

この章では、ユーザーに挨拶メッセージを送信する簡単なWebアプリケーションを開発する方法を学習します。WebサービスプロジェクトはWSDLモデルを使用します。CXFでは、Apache CXF APIを基盤となるWSDLにマップするための単純なフロントエンドを提供することにより、このWSDLモデルを非表示にすることができます。

この最も単純なプロジェクトでは、Webサービスのインターフェースがクライアントに直接公開され、クライアントはネイティブのApache CXFAPIを使用してWebサービスを呼び出します。

まず、Webサービスを作成します。すべてのサービスには、クライアントに公開されるインターフェースがあります。このインターフェースは、単純なApacheCXFインターフェースまたはWSDLドキュメントとして記述できます。このApacheCXF-Firstアプローチでは、ApacheCXFインターフェースを介してサービスを公開します。

Webサービスの開発

Web上で作成するサービスには、という単一のWebメソッドがあります。 greetings。メソッドはかかりますstringユーザーの名前を送信する引数を入力します。サービスは、受信したユーザー名をメッセージに含めて、発信者にグリーティングメッセージを送り返します。

Webサービスインターフェイス

Webサービスのインターフェースを公開するために、次のようにApacheCXFインターフェースを作成します。

//HelloWorld.java
package com.tutorialspoint.cxf.pojo;
public interface HelloWorld {
   String greetings(String text);
}

インターフェイスには、呼び出されるメソッドが1つだけあります greetings。サーバーはこのインターフェースを実装します。ささいなアプリケーションでは、このインターフェイスはクライアントに直接公開されます。通常、Webサービスアプリケーションでは、WSDLを使用してWebサービスインターフェイスを記述します。この単純なアプリケーションでは、この直接インターフェイスをクライアント開発者に提供します。その後、クライアントはgreetingsサーバーオブジェクトのメッセージ。それでは、最初にWebサービスを作成しましょう。

Webサービスの実装

ザ・ HelloWorld インターフェースはに実装されています HelloWorldImpl 以下に示すApacheCXFクラス-

//HelloWorldImpl.java
package com.tutorialspoint.cxf.pojo;
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String greetings(String text) {
      return "Hi " + text;
   }
}

ザ・ greetings メソッドはのパラメータを受け取ります string タイプし、それをグリーティングメッセージに追加し、結果の文字列を呼び出し元に返します。

次に、をホストするサーバーアプリケーションを作成します HelloWorld サービス。

サーバーの作成

サーバーアプリケーションは2つの部分で構成されています-

  • 最初の部分は、Webサービスのファクトリを作成します。

  • 2番目の部分は main それをインスタンス化するための方法。

サーバーは ServerFactoryBean CXFライブラリによって提供されるクラス HelloWorldリモートクライアントへのインターフェイス。したがって、最初にインスタンス化しますServerFactoryBean クラスを作成し、そのさまざまなプロパティを設定します-

ServerFactoryBean factory = new ServerFactoryBean();

を呼び出すことによって呼び出されるサービスクラスを設定します setServiceClass 上の方法 factory オブジェクト-

factory.setServiceClass(HelloWorld.class);

工場の電話でサービスを呼び出すためのURLを設定します setAddress方法。サービスはこのURLで公開されることに注意してください。

factory.setAddress("http://localhost:5000/Hello");

この場合、サービスは組み込みサーバーにデプロイされ、ポート5000をリッスンします。任意のポート番号を選択できます。

ファクトリを作成する前に、サービス実装クラスについてファクトリに通知する必要があります。これは、setServiceBean 上の方法 factory ここに示されているオブジェクト-

factory.setServiceBean(new HelloWorldImpl());

サービスBeanは、サービス実装クラスのインスタンスに設定されます。最後に、ファクトリを呼び出して作成しますcreate 方法−

factory.create();

さて、Webサービスを実行するためのファクトリを開発したので、次に main それをインスタンス化し、しばらくの間実行し続ける方法。

今、書く 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);
   }
}

私たちが作成したサーバーアプリケーションは ServerFactoryBeanCXFライブラリのクラス。これらのライブラリをプロジェクトに含めて、コンパイルを正常に行う必要があります。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また、上記で作成したApacheCXFファイルを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には、このプロジェクトとは関係のない追加の依存関係が含まれている場合がありますが、このチュートリアルの次のプロジェクトで必要になります。とにかく、追加の依存関係を含めること自体に害はありません。

プロジェクトフォルダ構造

サーバーとクライアントのApacheCXFファイルを配置した後の私のマシンのプロジェクトフォルダー構造を、クイックリファレンスとして以下に示します-

実行中のサーバー

プロジェクトをビルドするには、コマンドラインウィンドウで次のコマンドを使用します-

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を指定します。次の出力が表示されます-

これにより、サービスがローカルホストの指定されたポートで実行されていることが確認されます。指定しなかったのでgreetings 呼び出しのメッセージでは、SOAP障害メッセージがブラウザに返されます。

選択したSOAPクライアントを使用して、Webサービスをさらにテストできます。ここでは、Postmanを使用してサーバーをテストしました。

出力は次のようになります-

それを観察する SOAP Request手作業でコーディングされました。リクエストを投稿した後、サーバーはSOAP Response スクリーンショットの下部に表示されるメッセージ。

このことから、CXFは要求と応答の両方にSOAPプロトコルの使用を維持しながら、今日の世界に存在するさまざまなWebテクノロジーへの統一されたビューを提供することが理解できます。これにより、Webアプリケーションの開発が大幅に簡素化されます。

次のタスクは、作成したWebサービスを使用するクライアントを作成することです。

クライアントの作成

サーバーアプリケーションで HelloWorldWebサービスを公開するインターフェースです。Webサービス自体は、クライアントにプレーンなグリーティングメッセージを提供するだけです。通常、Webサービスインターフェイスは、WSDL(Webサービス記述言語)を使用して外部に公開されます。この簡単なアプリケーションでは、サービスインターフェイスを直接公開することで、Webサービスをクライアントに公開します。HelloWorld.class

この目的のために、CXFはと呼ばれるファクトリクラスを提供します ClientProxyFactoryBean これにより、作成したファクトリインスタンスへの目的のインターフェイスに接続できます。

まず、次のようにファクトリBeanインスタンスを作成します-

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();

私たちは setAddressファクトリBeanインスタンスのメソッドを使用して、Webサービスを呼び出すことができるURLを設定します。この例では、前の手順でサーバーを作成するときに使用したURLを使用します-

factory.setAddress("http://localhost:5000/Hello");

次に、 create 上の方法 factory サービスインターフェースを接続するインスタンス HelloWorld.class それに。

HelloWorld helloServer = factory.create(HelloWorld.class);

最後に、 greetings リモートWebサービスを呼び出すメソッド。

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はユーザー名です。自分の名前で挨拶があります。

次の章では、JAX-WS(Apache CXF API for XML Web Services)プロジェクトでCXFを使用する方法を学習します。