出力 MediaType の適用

Result​ オブジェクト​により、出力の ​mimeType​ を設定できます。ただし、この設定は省略可能です (SDK 開発者には、​mimeType​ の設定は求められていません)。

一方で、操作の出力 ​mimeType​ が必須である次のようなケースもあります。

  • 操作が ​String​ を返す場合。

  • 操作が ​InputStream​ を返す場合。

この制限は任意ではありません。Mule 4 は DataWeave を式言語として使用するため、ユーザーはデータの形式を気にする必要はありません。気にする必要があるのは、構造のみです。ただし、DataWeave が Mule メッセージで伝達されるすべての値のメディア種別を判断できればよいのです。

SDK は、DataWeave が自動的に必要な情報を得られるように作業の大半を処理しますが、操作で ​String​ などの汎用型が返された場合は、データが JSON なのか、XML なのか、あるいはプレーンテキスト形式なのかを知ることは不可能です。​InputStream​ が返された場合も同様で、JSON、XML、または CSV ストリーム、あるいはバイナリ情報の可能性もあります。いずれのケースでも、開発者はデザイン時にこの情報を SDK に対して指定する必要があります。

そのために ​@MediaType​ アノテーションが用意されています。​String​ または ​InputStream​ を返すすべてのソースと操作は、MediaType を ​/​ に指定してある場合でも、このアノテーションを使用する必要があります。

たとえば、顧客に関する情報を返す操作を開発しているとします。また、この操作は XML 形式で情報を返すものとします。この場合は、次のように定義できます。

@MediaType(MediaType.APPLICATION_XML)
public String getCustomerInfo(String customerId) {
  return fetchCustomerXml(customerId);
}

また、ビデオを ​mp4​ 形式で返すビデオストリーミングモジュールを開発している場合なら、次のようになります。

@MediaType("video/mp4")
public InputStream getVideo(String videoId) {
  return getVideoStream(videoId);
}
@MediaType​ アノテーションは、最も一般的なメディア種別に対して定数セットを定義しています。ただし、ビデオメディア種別の例に示されているように、必要なカスタム ​mediaType​ を使用することもできます。

strict = false メディア種別

上記の例では、操作は指定されている以外のメディア種別を返すことはできません。しかし、​最も可能性の高い​メディア種別しか分からない場合や、​mediaType​ を特定できない場合もあります。このようなケースに備えて、​@MediaType​ アノテーションには ​strict = false​ オプションが用意されています。

可変メディア種別

顧客情報を取得する操作の例に戻り、接続先のサービスがデフォルトでは XML を返し、さらに、異なる形式を使用するように特定のアカウントを設定することもできるとします。また、そのメディア種別を事前に知ることはできないとします。この場合は、次のように定義できます。

@MediaType(value = MediaType.APPLICATION_XML, strict = false)
public String getCustomerInfo(String customerId) {
  return fetchCustomerXml(customerId);
}

strict​ パラメーターを ​false​ に設定すると、​outputMimeType​ パラメーターが自動的に操作に追加されます。このパラメーターにより、モジュールのユーザーは ​mimeType​ を手動で上書きできます。そのため、自分のアカウントを知っていて、JSON を使用するように設定されているユーザーであれば、次のように指定できます。

<customers:get-customer-info customerId="999" outputMimeType="application/JSON" />

不明なメディア種別

HTTP 要求のケースを考えてみましょう。取得されるメディア種別はヒットするエンドポイントによって変わります。取得するメディア種別が不明であるため、​ANY​ (​/​) を使用します。

@MediaType(value =  "*/*", strict = false)
public InputStream request(String path) {
  return httpClient.request(path);
}

ここでも、​strict = false​ 属性によって、ユーザーはエンドポイントに応じて ​mimeType​ を手動で設定できます。

<http:request path="/customer/999" outputMimeType="application/JSON" />
自動的に追加される ​outputMimeType​ パラメーターは省略可能であり、デフォルト値はありません。ユーザーは、このパラメーターを空白のままにしておけます。その場合、SDK はアノテーションで設定されているメディア種別を使用します。