47.5. 引数名の置換
概要
API コンポーネントフレームワークでは、URI オプション名が 各プロキシークラス (Java API クラス) 内で一意 である必要があります。しかし、メソッドの引数名の場合は、必ずしもそうとは限りません。たとえば、API クラスの以下の Java メソッドについて考えてみましょう。
public void doSomething(int id, String name); public void doSomethingElse(int id, String name);
Maven プロジェクトのビルド時に、camel-api-component-maven-plugin は設定クラス ProxyClassEndpointConfiguration を生成します。これには、 クラスの すべて の引数の getter および setter メソッドが含まれます。たとえば、上記のメソッドを指定すると、プラグインは設定クラスに以下の getter メソッドと setter メソッドを生成します。
ProxyClass
public int getId(); public void setId(int id); public String getName(); public void setName(String name);
ただし、以下の例のように、id 引数が異なるタイプとして複数回表示される場合はどうなるでしょうか。
public void doSomething(int id, String name); public void doSomethingElse(int id, String name); public String lookupByID(String id);
この場合、コードの生成に失敗します。これは、int を返す getId メソッドと、String を返す getId メソッドを同じスコープで定義できないためです。この問題に対する解決策は、引数名の置換を使用して、引数名と URI オプション名のマッピングをカスタマイズすることです。
構文
substitutions 要素は、以下のように 1 つ以上の substitution 子要素で定義できます。
<substitutions>
<substitution>
<method>MethodPattern</method>
<argName>ArgumentNamePattern</argName>
<argType>TypeNamePattern</argType>
<replacement>SubstituteArgName</replacement>
<replaceWithType>[true|false]</replaceWithType>
</substitution>
...
</substitutions>
argType 要素と replaceWithType 要素は任意であり、省略できます。
スコープ
以下の抜粋で示されているように、substitutions 要素は、任意で apis 要素の子や api 要素の子として表示できます。
<configuration>
<apis>
<api>
<apiName>...</apiName>
...
<substitutions>...</substitutions>
</api>
<substitutions>...</substitutions>
...
</apis>
</configuration>
以下のスコープで substitutions 要素を定義できます。
-
api要素の子として:substitutionsは、api要素で指定された API クラスにのみ適用されます。 -
apis要素の子として:substitutionsは、デフォルトですべての API クラスに適用されますが、apiレベルで上書きできます。
子要素
それぞれの 置換 要素は以下の子要素で定義できます。
method-
Java API のメソッド名と一致する正規表現 (
java.util.regex構文) を指定します。 argName-
正規表現 (
java.util.regex構文) を指定して、一致したメソッドの引数名とマッチさせます。通常、パターンにはキャプチャーグループが含まれます。 argType-
(任意) 引数の型に一致する正規表現 (
java.util.regex構文) を指定します。replaceWithTypeオプションをtrueに設定した場合、通常はこの正規表現でキャプチャーグループを使用します。 replacement-
methodパターン、argNameパターン、および (任意の)argTypeパターンに一致する場合、replacement要素は代替の引数名を定義します (URI で使用)。代替テキストは、argName正規表現パターンから取得した文字列を使用して作成できます(構文 $1、$2、$3を使用してそれぞれ 1 番目、2 番目、または 3 番目のキャプチャーグループを挿入します)。replaceWithTypeオプションをtrueに設定すると、argType正規表現パターンから取得した文字列を使用して代替テキストを作成することもできます。 replaceWithType-
trueの場合、代替テキストがargType正規表現から取得した文字列を使用して作成されるように指定します。デフォルトはfalseです。
例
以下の置換例は、接尾辞 Param を引数名に追加して、java.lang.String タイプのすべての引数を変更します。
<substitutions>
<substitution>
<method>^.+$</method>
<argName>^.+$</argName>
<argType>java.lang.String</argType>
<replacement>$1Param</replacement>
<replaceWithType>false</replaceWithType>
</substitution>
</substitutions>たとえば、次のようなメソッドの署名があるとします。
public String greetUs(String name1, String name2);
このメソッドの引数は、エンドポイント URI でオプション name1Param および name2Param で指定されます。