特殊なパラメーター

TypedValue<Type>

操作​および​ソース​の一般的なユースケースは、パラメーターの値と共にメディア種別情報を受け取ることです。次に例を示します。

例: 操作
public void receiveContent(InputStream content) {
  // operation logic
}

以下の Mule アプリケーションの例では ​JSON​ 値を受け取りますが、上記の操作のコードでは ​content​ パラメーターの MIME タイプまたはエンコードが指定されていません。

例: Mule アプリケーション
<flow name="mediaTypeFlow">
    <set-payload value="#[output application/json --- { key : 'value'}]">
    <cool-extension:receive-content content="#[payload]" />
</flow>

メディア種別情報 (MIME タイプやエンコード) を取得するには、パラメーター種別を ​TypedValue<OriginalType>​ にラップする必要があります。

次の例では、​TypedValue​ パラメーターと共に上記と同じ Mule アプリケーションを使用します。

メディア種別フレンドリーなパラメーター
public void receiveContent(TypedValue<InputStream> content) {
    DataType dataType = content.getDataType();
    MediaType mediaType = dataType.getMediaType();
    boolean streamType = dataType.isStreamType();
    Long length = content.getLength().orElse(-1L);

    InputStream theContent = content.value(); // The proper value

    System.out.println(mediaType);  // application/json; UTF-8
    System.out.println(streamType); // true
    System.out.println(length);     // 18
}

これに連動する他のシステムと通信したり、パラメーター値を処理できるようにしたりするために ​MIME Type​ 情報が必要なユースケースでは、​TypedValue​ パラメーターを使用することを強くお勧めします。

Literal<Type>

Literal<Type>​ パラメーターでは、Mule アプリケーションに書き込まれたときのままの値を取得できます。つまり、エンドユーザーが ​#[attributes.queryParams]​ のような式を記述する場合、操作は式 ​#[attributes.queryParams]​ が含まれる ​String​ (文字列) を取得できます。これにより、Mule Runtime によって式が解決されたり、変換が適用されたりすることを回避できます。これは、サードパーティで評価する必要がある場合に役立ちます。

設定および接続プロバイダーの場合、リテラルパラメーターを使用すると、​設定を動的ではなく静的な設定として処理できます​。これは、リテラルが式の場合でもリテラル値は定数になるためです。Runtime で値が自動的に評価されることはなく、拡張機能で静的値として処理されます。

値が式として入力された場合、クラスでは式が提供されますが、評価する方法は提供されません。その​パラメーターリゾルバー​を使用する必要があります。

<flow name="literalFlow">
    <cool-extension:literal-value content="#[payload]" />
</flow>
リテラルパラメーター
public void literalValue(Literal<InputStream> literal) {
    System.out.println(literal.getLiteralValue().get());  // #[payload]
    System.out.println(literal.getType()); // java.io.InputStream
}
汎用型を考慮する必要があります。このインターフェースの使用によって派生するパラメーターの型は、汎用型に応じて設定されます。汎用型は省略できません。

ParameterResolver<Type>

ParameterResolver<Type>​ では、操作に対する式の解決を延期できます。これは、値として式を取るパラメーターが必要でない場合に役立ちます。そのような式を自動的に解決する代わりにコネクタのコード内でオンデマンドで解決してパフォーマンスを改善できます。

Literal<Type>​ パラメーターに対して、式が含まれる ​ParameterResolver<Type>​ パラメーターは、値が解決されるかどうかに関係なく、常に動的パラメーターとして処理されます。

ParameterResolver​ を設定や接続プロバイダーの内部で使用することはできません。

式の解決

ParameterResolver<Type>​ を受け取って式の値を解決する場合、​resolve()​ メソッドをコールして、式の結果を返す必要があります。

  • 式の解決は、必要になるまで延期されるため、​resolve()​ は無効な式のために失敗する可能性があります。

  • パラメーターリゾルバーは、操作内でのみ使用できます。そのため、パラメーターリゾルバーを設定内で使用することはできません。

式の値の取得

ParameterResolver<Type>​ パラメーターは、パラメーターで使用される式を伝えることができます。パラメーターは式を使用しても、使用しなくても設定できるため、​Optional<String>​ が返されます。式を使用して設定されていない場合、​Optional.empty()​ が返されます。

例: 式を使用する

式を使用した設定
<flow name="expressionParameterResolver">
  <cool-extension:add-products products="#[{Potatoes : 2 , Oranges : 4}]"/>
</flow>
例: ソース
public void addProducts(ParameterResolver<Map<String,Integer>> products) {
    System.out.println(products.getExpression().get());  // #[{Potatoes : 2 , Oranges : 4}]
    System.out.println(products.resolve()); // {Potatoes=2, Oranges=4}
}

例: 式を使用しない

式を使用しない設定
<flow name="noExpressionParameterResolver">
    <cool-extension:add-products>
        <cool-extension:products>
          <cool-extension:product key="Potatoes" value="2"/>
          <cool-extension:product key="Oranges" value="4"/>
        </cool-extension:product>
    </cool-extensions:add-products>
</flow>
public void addProducts(ParameterResolver<Map<String,Integer>> products) {
    System.out.println(products.getExpression().isPresent());  // false
    System.out.println(products.resolve()); // {Potatoes=2, Oranges=4}
}

型の積み上げ

上記のパラメーターを同時に複数使用することが必要になる場合があります。たとえば、特定の値のメディア種別を受け取り、その解決を延期する場合などです。

これを行うには、必要な機能の汎用型を積み上げます。

<flow name="stackedTypes">
  <cool-extension:add-products products="#[output application/json --- {Potatoes : 2 , Oranges : 4}]"/>
</flow>
public void addProducts(ParameterResolver<TypedValue<InputStream>> products) {
    System.out.println(products.getExpression().get());  // #[output application/json --- {Potatoes : 2 , Oranges : 4}]
    TypedValue<InputStream> content = products.resolve();
    System.out.println(content.getValue()); // {"Potatoes" : "2", "Oranges" : "4"}
}