代理パラメーターをパラメーターの一部として定義するには、コンポーネントで値プロバイダーおよびサンプルデータプロバイダーに対する参照のバインドを定義する必要があります。
これらのバインドにより、プロバイダーの代理パラメーターが評価済みの DataWeave 式の値を取得できるようになります。
代理パラメーターに対するバインドが定義されていない場合、同じ暗黙的なバインドが適用されます。代理パラメーターの名前は、そのパラメーターの値を取得するためにコンポーネント内のパラメーターの名前と同じである必要があります。
@Binding アノテーションを使用して、代理パラメーターを定義します。@FieldValues アノテーションと @SampleData アノテーションは、代理パラメーターが取得する値を定義するためにバインドの配列を取得します。
定義されたバインドは、抽出式を提供することで代理パラメーターが取得する値を宣言します。この抽出式は、セレクターのみを使用して代理パラメーターの値を取得する DataWeave 式です。
代理パラメーターの値の抽出に使用される抽出式には、いくつかの制限があります。
-
コンテキストからのデータは集約されません。パラメーター内の項目の値のみにアクセスするように制限されています。
-
抽出式の最初の部分は、コンポーネントのパラメーターの名前にのみ対応します。
-
抽出式を実行して値プロバイダーまたはサンプルデータプロバイダーの代理パラメーターに値を提供する場合、出力メディアタイプは常に application/java です。これは、プロバイダーが application/json または application/xml などの他のメディアタイプを想定していないことを意味します。
式で使用可能なコンテキストには、すべてのコンポーネントのパラメーターの値があります。式は、コンポーネントのパラメーターの名前で始まる必要があります。値がパラメーターの一部から取得されている場合、式はセレクターに従って目的の項目に移動します。
次の例は、代理パラメーター workspace に連動する値を持つ項目を含む body というパラメーターを示しています。
public class ChatOperations {
public void sendChatMessage(@Connection ChatConnection chatConnection,
@FieldValues(value = ChannelsValueProvider.class, targetSelectors = "channelId",
bindings = {@Binding(actingParameter = "workspace", extractionExpression = "body.routingInfo.workspace")}))
@TypeResolver(ChatMessageResolver.class) @Content InputStream body) {
// Do message sending
}
}
この代理パラメーターは、同じ body パラメーターから取得されます。
次の構文は、この例で使用される値プロバイダーを示しています。
public class ChannelsValueProvider implements ValueProvider {
@Connection
private ChatConnection chatConnection;
@Parameter
private String workspace;
@Override
public Set<Value> resolve() {
return ValueBuilder.getValuesFor(chatConnection.getChannels(workspace));
}
@Override
public String getId() {
return "Channels value provider";
}
}
値プロバイダーで定義された workspace 代理パラメーターは、コンポーネントのコンテキストから項目の値を取得する抽出式にバインドされます。