47.5. 参数名称替换
概述
API 组件框架要求 URI 选项名称 在每个代理类(Java API 类)中是唯一的。但是,这并非总是是方法参数名称的情况。例如,考虑 API 类中的以下 Java 方法:
public void doSomething(int id, String name); public void doSomethingElse(int id, String name);
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);
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);
public void doSomething(int id, String name);
public void doSomethingElse(int id, String name);
public String lookupByID(String id);
					在这种情况下,代码生成会失败,因为您无法定义一个返回 int 的 getId 方法,以及一个在同一范围内返回 String 的 getId 方法。这个问题的解决方案是使用 参数名称替换来自定义参数名称到 URI 选项名称 的映射。
				
语法
					可以使用一个或多个 替换 子元素定义 替换 元素,如下所示:
				
					其中 argType 元素和 replaceWithType 元素是可选的,可以省略。
				
影响范围
					如以下提取所示,replaces 元素可以选择性地显示为 apis 元素和/或作为 api 元素子元素的子级: 
				
					您可以在以下范围中定义 replaces 元素: 
				
- 
							作为 api元素的子级 ,替换只应用于由api元素指定的 API 类。
- 
							作为 apis元素的子级 ,默认情况下,替换适用于所有 API 类,但可以在api级别被覆盖。
子元素
					每个 替换 元素可使用以下子元素定义:
				
- 方法
- 
								指定正则表达式(java.util.regex语法),以匹配 Java API 的方法名称。
- argName
- 
								指定正则表达式(java.util.regex语法),以匹配匹配方法中的参数名称,其中模式通常包含捕获组。
- argType
- 
								(可选) 指定正则表达式(java.util.regex语法)以匹配参数的类型。如果将replaceWithType选项设置为true,则通常使用捕获此正则表达式中的组。
- replacement
- 
								假设 方法模式、argName模式和 (可选)argType模式的特定匹配,则替换元素定义替换参数名称(用于 URI)。可以使用从argName正则表达式模式捕获的字符串构建替换文本(使用语法$1、$2、$3分别插入第一个、第二个或第三个捕获组)。或者,如果您将replaceWithType选项设置为true,可以使用从argType正则表达式模式捕获的字符串构建替换文本。
- replaceWithType
- 
								为 true时,使用从argType正则表达式捕获的字符串构建替换文本。默认值为false。
示例
					以下替换示例通过将后缀 Param 添加到参数名称来修改 java.lang.String 类型的每个参数:
				
例如,给定以下方法签名:
public String greetUs(String name1, String name2);
public String greetUs(String name1, String name2);
					此方法的参数将通过端点 URI 中的选项 name1Param 和 name2Param 指定。