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
を生成します。これには、ProxyClass
クラスのすべての引数の getter および setter メソッドが含まれます。たとえば、上記のメソッドを指定すると、プラグインは設定クラスに以下の getter メソッドと setter メソッドを生成します。
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
レベルで上書きできます。
子要素
各 substitution
要素は以下の子要素で定義できます。
メソッド
-
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
で指定されます。