Flex Gateway新着情報
Governance新着情報
Monitoring API ManagerJava SDK には、値プロバイダーとサンプルデータでの項目レベルの機能をサポートするいくつかの機能が含まれています。これらの機能を使用すると、パラメーター項目の値プロバイダーを定義したり、パラメーター項目を値プロバイダーまたはサンプルデータの代理パラメーターとして使用したりできます。
これらの機能は Mule 4.4.0 と互換性がありますが、Mule バージョンに関係なく、すべての Anypoint Connector で使用できます。
アノテーション @FieldValues
を使用して、パラメーター項目の値プロバイダーを定義します。
@FieldValues
アノテーションには次の情報が必要です。
value
項目の値を提供します。
targetSelectors
値プロバイダーによって提供された値がパラメーターのどの部分に含まれるかを説明します。 DataWeave 構文では、アノテーションのこの部分を定義し、ネストされた項目、XML 属性、または名前にスペースを含む項目を介してセレクターを説明します。
次の例は、JSON 入力ストリームである body
というパラメーターに指定された値を含む操作を示しています。
public class ChatOperations { public void sendChatMessage(@Connection ChatConnection chatConnection, @FieldValues(value = WorkspacesValueProvider.class, targetSelectors = "routingInfo.workspace") @TypeResolver(ChatMessageResolver.class) @Content InputStream body) { // Do message sending } }
body
パラメーターには、routingInfo という項目があり、この項目には workspace
という項目があります。WorkspacesValueProvider は、接続を使用して可能なワークスペースを取得する値プロバイダーです。
パラメーターには、値が提供される部分を複数使用できます。
@FieldValues
アノテーションは繰り返し可能なアノテーションであるため、パラメーターに複数回アノテーションを付けることができます。
次の例は、body
というパラメーターを使用した操作を示しています。このパラメーターは、値プロバイダーで 2 つの部分を使用する JSON 入力ストリームです。
public class ChatOperations { public void sendChatMessage(@Connection ChatConnection chatConnection, @FieldValues(value = WorkspacesValueProvider.class, targetSelectors = "routingInfo.workspace") @FieldValues(value = ChannelIdValueProvider.class, targetSelectors = "channelId") @TypeResolver(ChatMessageResolver.class) @Content InputStream body) { // Do message sending } }
パラメーター body
は、相互に独立した値を持つ 2 つの項目 (routingInfo.workspace と channelId) の値を定義します。
パラメーターのいくつかの部分に対してマルチレベル値プロバイダーを使用します。
たとえば、channelId 項目の値を routingInfo.workspace 項目の値に連動させるとします。
これを定義するため、@FieldValues
アノテーションの targetSelectors 属性は常に文字列の配列を受け取ります。複数の文字列が指定されている場合は、マルチレベル値プロバイダーが定義されます。指定された各項目では、値プロバイダーの値部分、配列内の順序、および値部分の順序を定義します。
次の例は、パラメーター部分のマルチレベル値プロバイダーを定義する方法を示しています。
public class ChatOperations { public void sendChatMessage(@Connection ChatConnection chatConnection, @FieldValues(value = ChatMultiLevelValueProvider.class, targetSelectors = {"workspace", "channelId"}) @TypeResolver(ChatMessageResolver.class) @Content InputStream body) {} }
マルチレベル値プロバイダーは、他の値プロバイダーと同様に含まれています。
次の例は、マルチレベル値プロバイダーがどのように表示されるかを示しています。
public class ChatMultiLevelValueProvider implements ValueProvider { @Connection private ChatConnection chatConnection; @Override public Set<Value> resolve() { Set<Value> values = new HashSet<>(); List<String> workspaces = chatConnection.getWorkspaces(); workspaces.stream().forEach(workspace -> { ValueBuilder valueBuilder = newValue(workspace); chatConnection.getChannels(workspace).stream().forEach(channel -> valueBuilder.withChild(newValue(channel))); values.add(valueBuilder.build()); }); return values; } @Override public String getId() { return "Chat multilevel value provider"; } }
対象セレクターは DataWeave 構文を使用します。操作のパラメーターが XML 要素である場合、この構文を使用して、そのパラメーターの一部である属性の値プロバイダーを定義します。
次の例は、DataWeave 構文で属性の値プロバイダーを定義する方法を示しています。
public class ChatOperations { public void sendChatMessage(@Connection ChatConnection chatConnection, @FieldValues(value = ChannelIdValueProvider.class, targetSelectors = "message.target.@channelId") @TypeResolver(XmlChatMessageResolver.class) @Content InputStream body) {} }
この例では、body
パラメーターは message というルートタグを含む XML 要素です。これには、channelId 属性を使用する target、および関連付けられた値プロバイダーが含まれます。
代理パラメーター値を解決するときは、抽出式を実行し、代理パラメーターにその値を提供するコンポーネントからのパラメーターのメディアタイプを常に把握します。
パラメーターの静的メタデータを使用して、パラメーターのメディアタイプを取得します。 たとえば、パラメーターが JSON 入力ストリームで、静的メタデータがこれを反映していない場合、パラメーターの一部を代理パラメーターとして使用することはできません。
代理パラメーターをパラメーターの一部として定義するには、コンポーネントで値プロバイダーおよびサンプルデータプロバイダーに対する参照のバインドを定義する必要があります。 これらのバインドにより、プロバイダーの代理パラメーターが評価済みの 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
代理パラメーターは、コンポーネントのコンテキストから項目の値を取得する抽出式にバインドされます。
次の例は、代理パラメーターをコンポーネント内のパラメーターの項目の値にバインドする @SampleData
アノテーションを示しています。
public class ChatOperations { @SampleData(value = ChatMessageSampleDatatProvider.class, bindings = {@Binding(actingParameter = "workspace", extractionExpression = "body.routingInfo.workspace")})) public Result<InputStream, ChatAttributes> retrieveChatMessage(@Connection ChatConnection chatConnection, @TypeResolver(ChatMessageResolver.class) @Content InputStream body) { // Do chat message retrieval } }
ChatMessageSampleDatatProvider には、サンプルデータを提供する workspace
というパラメーターが含まれています。この代理パラメーターの値は、バインドで定義された抽出式から取得されます。