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> <substitution> <method>MethodPattern</method> <argName>ArgumentNamePattern</argName> <argType>TypeNamePattern</argType> <replacement>SubstituteArgName</replacement> <replaceWithType>[true|false]</replaceWithType> </substitution> ... </substitutions>
其中 argType
元素和 replaceWithType
元素是可选的,可以省略。
影响范围
如以下提取所示,替换
元素可以选择性地显示为 apis
元素的子级和/或作为 api
元素的子级:
<configuration> <apis> <api> <apiName>...</apiName> ... <substitutions>...</substitutions> </api> <substitutions>...</substitutions> ... </apis> </configuration>
您可以在以下范围中定义 替换
元素:
-
作为
api
元素的子级 ,则替换
仅应用到api
元素指定的 API 类。 -
作为
apis
元素的子级 ,它默认应用于所有 API 类,但可以在api
级别上覆盖。
子元素
每个 替换
元素可使用以下子元素定义:
方法
-
指定正则表达式(
java.util.regex
语法),以匹配 Java API 中的方法名称。 argName
-
指定正则表达式(
java.util.regex
语法)以匹配匹配方法中的参数名称,其中模式通常包含捕获组。 argType
-
(可选) 指定一个正则表达式(
java.util.regex
语法)以匹配参数的类型。如果将replaceWithType
选项设置为true
,则通常在此正则表达式中使用捕获组。 替换
-
根据
方法
模式、argName
模式和(可选)argType
模式的特定匹配,替换
元素定义替换参数名称(用于在 URI 中使用)。可以使用从argName
正则表达式模式捕获的字符串(使用语法$1
、$2、$2
、$3
分别插入第一个、第二个或第三个捕获组)来构建替换文本。或者,如果将replaceWithType
选项设置为true
,则可以使用从argType
正则表达式模式捕获的字符串来构建替换文本。 replaceWithType
-
为
true
时,使用从argType
正则表达式捕获的字符串组成替换文本。默认值为false
。
Example
以下替换示例通过将 suffix, 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
来指定。