Hatの佐藤匡剛です。APIコンポーネントフレームワーク紹介記事の第2回目です。前回はこのフレームワークが何なのかを説明したので、今回は実際にその使い方を説明します。プロジェクトの生成APIコンポーネントフレームワークを使ってカスタムコンポーネントを開発するには、まずMavenアーキタイプcamel-archetype-api-componentでプロジェクトの雛形を生成します。-DinteractiveMode=false以下のようなMavenマルチプロジェクトが生成されます。nameパラメータの文字列がxxxxxComponent、xxxxxConfiguration、xxxxxConsumer、xxxxxEndpoint、xxxxxProducerといったクラス名のプレフィックスになります。schemeパラメータの文字列が生成されるコンポーネントのエンドポイントURIのスキーム名("hello://...")になります。pom.xmlプロジェクトは2つのサブプロジェクトで構成されています。(オプション)3rdパーティのJavaライブラリを直接使えない場合に、カスタムでAPIを用意するためのプロジェクト。APIの場合も生成したJavaクライアントをここに置く。必要無い場合は、ルートプロジェクトと一緒に削除してxxxxx-componentプロジェクトだけを使う。開発するコンポーネントの本体。camel-hello-component/pom.xmlを見ると、camel-hello-apiがdependencyに定義されています。3rdパーティのライブラリを使う場合は、このAPIプロジェクトを削除して代わりにライブラリのdependencyに置き換えます。</dependency>例えば、camel-twilioでは以下のようになっています。</dependency>ここでjavadocタイプのdependencyも登場していますが、なぜ必要かはこれから説明します。camel-hello-apiを使ってcamel-helloコンポーネントを完成させます。APIとエンドポイントURIのマッピング次にやることは、APIとCamelエンドポイントとのマッピングを設定することです。第1回に説明したように、APIコンポーネントのエンドポイントURIは基本的に以下の形式になります。scheme://apiName/methodName?option1=value1&...&optionN=valueN自動生成されたcamel-hello-apiのAPIクラスHelloFileHelloを見ると、以下の通りです。}}これを、以下のようなエンドポイントURIにマッピングします。hello://hello-file/sayHihello://hello-file/greetMehello://hello-file/greetUsメソッド引数のマッピングAPIメソッドの引数は、次のようにURIのオプションにハードコードして渡すこともできます。hello://hello-file/greetUs?name1=Llama&name2=Alpacaしかし、たいていの場合は動的に値を渡したいと思うので、Camelメッセージのヘッダで渡します。Xxxxxには、プロジェクト生成時にnameパラメータで指定した文字列が入ります。メッセージボディを直接引数に渡したい場合は、特別なURIオプションinBodyを使います。inBodyの値には、ボディをどの引数に渡すかを引数名で指定します。.to("hello://hello-file/greetMe?inBody=name");これでgreetMeメソッドの引数nameにメッセージボディが直接渡されます。第1回の記事で、APIコンポーネントフレームワークの要点はコード生成とリフレクションだと説明しました。このAPIメソッドからエンドポイントURIへのマッピングでリフレクションが使われるので、開発者がメソッド毎にいちいちエンドポイントの処理を手書きする必要がありません。メソッドの引数名は、Javaバイトコードの仕様上リフレクションで取得することができません。Javaの.classファイルには引数名の情報が残っていないからです。そこで、dependencyのJARファイルとは別にAPIのシグネチャを取得する方法が必要です。APIコンポーネントフレームワークは2つの方法をサポートしています。Javadocから取得するテキストファイルに書き出したシグネチャを読み込むそのため、1の方法を用いる場合にjavadocのdependencyが必要になるのです。APIコンポーネントのマッピング設定camel-hello-component/pom.xmlを開いて、Mavenプラグインにマッピング設定を記述します。様々なオプションがコメントアウトされた状態で出力されているので、これを眺めるだけでもどんなことができるのか、ある程度理解できると思います。</executions></plugin>ひとまずポイントはここです。</api><apiName>でエンドポイントURIのapiNameに当たる部分を定義します。<proxyClass>でそのエンドポイントの下敷きとなるAPIクラスを指定します。先ほどAPIのシグネチャを読み込む方法が2通りあると言いましたが、<fromSignatureFile>はファイルベースの方法です。signatures/file-sig-api.txtを見るとこのようにシグネチャが定義されています。name2);シグネチャファイルでなくJavadocを使う場合は<fromJavadoc>を指定します。この場合、わざわざ自分でシグネチャを書く必要がないので、通常はこちらの方法がお勧めです。3rdパーティライブラリにJavadocがない、など特殊な場合にのみシグネチャファイルを使います。</api>とりあえず設定はこのままでも動くので、このまま進めます。ConfigurationとEndpointの修正ソースコードで最低限修正が必要なのは2箇所です。camel-hello-component/src/main/java/com/redhat/sample/camel/hello/HelloConfiguration.javaを開きます。properties}ここに、コンポーネントの設定に必要なパラメータを追加します。Webサービスであれば、最低でも接続に認証情報が必要になるはずです。いった、ユーザがこのコンポーネントを使う際に設定すべきパラメータをここに追加します。APIを呼び出すだけなのでこのままにします。次に、camel-hello-component/src/main/java/com/redhat/sample/camel/hello/HelloEndpoint.javaを開きます。}重要なのはafterConfigureProperties()メソッドです。ここで、エンドポイント毎にAPIオブジェクトのインスタンスを生成し、apiProxyフィールドに保持します。APIオブジェクトを生成する際にWebサービスへの接続が必要な場合は、ここで先ほど修正したConfigurationクラスから必要なパラメータを受け取って接続を行います。ここも、今回のサンプルではこのままにします。ビルドと実行プロジェクトが完成したら、以下を実行してビルド&インストールをします。installビルドが成功すると、camel-hello-component/target/にソースコードが生成されているのが見つかります。HelloJavadocHelloIntegrationTest.javagenerated-sourcesの方は、Mavenの設定でビルド時に一緒にコンパイルされるようになっています。毎回ビルド時に自動生成されるものなので、ソースコードリポジトリにコミットする必要はありません。generated-test-sourcesについても同様ですが、最終回のテストのところで詳しく説明します。出来上がったコンポーネントは、標準のCamelコンポーネントと同じようにMavenのdependencyに追加して、Camelルートより実行してください。</dependency>試しに次のような単体テストを実行してみましょう。}}実行結果はこんな感じになります。Alpacaおわりにとりあえず動作するコンポーネントが完成しました。野生のWebサービスのAPIは千差万別であり、それを上手くコンポーネントに飼いならすには高度なマッピングの設定が必要不可欠です。次回は、高度なマッピング設定の方法を説明します。21:54Tweet関連記事2019-05-13swagger-uiでAPIドキュメント公開方法レッドハットでコンサルティングしているフェンです。Hatの佐藤匡剛です。Hatの佐藤匡剛です。Hatの佐藤匡剛です。各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。