Apache-cxf-with-pojo

提供:Dev Guides
移動先:案内検索

POJOを使用したApache CXF

この章では、ユーザーに挨拶メッセージを送信する単純なWebアプリケーションを開発する方法を学習します。 Webサービスプロジェクトは、https://www.w3.org/TR/2001/NOTE-wsdl-20010315 [WSDL]モデルを使用します。 CXFでは、Apache CXF APIを基盤となるWSDLにマッピングするためのシンプルなフロントエンドを提供することにより、このWSDLモデルを隠すことができます。

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

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

Webサービスの開発

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

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

私たちのWebサービスのインターフェイスを公開するには、次のようにApache CXFインターフェイスを作成します-

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

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

Webサービスの実装

*HelloWorld* インターフェースは、以下に示すように *HelloWorldImpl* Apache CXFクラスに実装されています-
//HelloWorldImpl.java
package com.finddevguides.cxf.pojo;
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String greetings(String text) {
      return "Hi " + text;
   }
}
*greetings* メソッドは、 *string* タイプのパラメーターを受け取り、それをグリーティングメッセージに追加し、結果の文字列を呼び出し元に返します。

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

サーバーの作成

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

  • 最初の部分は、Webサービスのファクトリーを作成します。
  • 2番目の部分は、インスタンス化するための main メソッドを記述します。

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

ServerFactoryBean factory = new ServerFactoryBean();
*factory* オブジェクトで *setServiceClass* メソッドを呼び出して、サービスクラスを呼び出すように設定します-
factory.setServiceClass(HelloWorld.class);

ファクトリの setAddress メソッドを呼び出すことにより、サービスを呼び出すためのURLを設定します。 サービスはこのURLで公開されることに注意してください。

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

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

ファクトリーを作成する前に、サービス実装クラスについてファクトリーに伝える必要があります。 これは、以下に示すように factory オブジェクトで setServiceBean メソッドを呼び出すことで実行されます-

factory.setServiceBean(new HelloWorldImpl());

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

factory.create();

ここで、Webサービスを実行するファクトリを開発したので、次に 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.finddevguides.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);
   }
}

作成したサーバーアプリケーションは、CXFライブラリの ServerFactoryBean クラスを使用します。 HelloServer クラスを正常にコンパイルするには、これらのライブラリをプロジェクトに含める必要があります。 プロジェクトの依存関係を設定するには、 Maven を使用します。

Mavenプロジェクトのセットアップ

Mavenプロジェクトを作成するには、コマンドラインウィンドウに次のコマンドを入力します。 これはMacマシンでテスト済みです。 WindowsおよびLinuxインストールの場合、いくつかの場所で手順が異なる場合があります。

mvn archetype:generate

プロパティを求められたら、次の値を入力します-

Define value for property 'groupId': : com.finddevguides
Define value for property 'artifactId': : cxf-pojo
Define value for property 'version': 1.0-SNAPSHOT: : 1.0
Define value for property 'package': com.finddevguides: : com.finddevguides.cxf.pojo

mavenコマンドが完了すると、pom.xmlファイルとともに現在のフォルダーに適切なフォルダー構造が作成されます。

生成されたディレクトリ構造はここに示されています-

ディレクトリ構造

*pom.xml* にCXF依存関係を追加し、上記で作成した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.finddevguides</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.finddevguides.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.finddevguides.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.finddevguides.com/}HelloWorld from class com.finddevguides.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サービスをさらにテストできます。 ここでは、https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop//%40 [Postman]を使用してサーバーをテストしました。

出力はここに示されているようです-

サーバー出力の実行

*SOAP Request* が手動でコーディングされていることを確認してください。 リクエストを送信した後、サーバーは *SOAP Response* メッセージを送信しました。これはスクリーンショットの下部に表示されます。

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

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

クライアントを作成する

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

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

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

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();

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

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

次に、 factory インスタンスで create メソッドを呼び出して、サービスインターフェイス HelloWorld.class をアタッチします。

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

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

System.out.println(helloServer.greetings(System.getProperty("user.name")));

これにより、コンソールに挨拶メッセージが出力されます。

クライアントアプリケーションのソース全体を以下に示します-

//HelloClient.java
package com.finddevguides.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 finddevguides
*finddevguides* はユーザー名です。 自分の名前で挨拶を受け取ります。

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