312.5. マルチパートメッセージ

Camel 2.8.1 以降で利用可能

マルチパート SOAP メッセージは ServiceInterfaceStrategy でサポートされています。ServiceInterfaceStrategy は、JAX-WS 2.2 に従ってアノテーションが付けられ、Document Bare スタイルの要件を満たすサービスインターフェイス定義で初期化する必要があります。ターゲットメソッドは、JAX-WS 仕様に従い、以下の基準を満たす必要があります。1) in または in/out のヘッダー以外のパラメーターを最大 1 つ持っている、2) void 以外の戻り型が含まれる場合には、 in/out または out のヘッダー以外のパラメーターを含めることができない、3) void の戻り型が含まれる場合には最大 1 つの in/out または out ヘッダー以外のパラメーターを持つ必要がある。

ServiceInterfaceStrategy は、マッピング戦略が要求パラメーターまたは応答パラメーターのどちらに適用されるかを示すブール値パラメーターで初期化する必要があります。

ServiceInterfaceStrategy strat =  new ServiceInterfaceStrategy(com.example.customerservice.multipart.MultiPartCustomerService.class, true);
SoapJaxbDataFormat soapDataFormat = new SoapJaxbDataFormat("com.example.customerservice.multipart", strat);

312.5.1. マルチパートリクエスト

マルチパートリクエストのペイロードパラメーターは、ターゲット操作の署名を反映する BeanInvocation オブジェクトを使用して初期化されます。camel-soap DataFormat は、marshal() プロセッサーが呼び出されると、JAX-WS マッピングに従って、BeanInvocation のコンテンツを SOAP ヘッダーおよびボディのフィールドにマッピングします。

BeanInvocation beanInvocation = new BeanInvocation();

// Identify the target method
beanInvocation.setMethod(MultiPartCustomerService.class.getMethod("getCustomersByName",
    GetCustomersByName.class, com.example.customerservice.multipart.Product.class));

// Populate the method arguments
GetCustomersByName getCustomersByName = new GetCustomersByName();
getCustomersByName.setName("Dr. Multipart");

Product product = new Product();
product.setName("Multiuse Product");
product.setDescription("Useful for lots of things.");

Object[] args = new Object[] {getCustomersByName, product};

// Add the arguments to the bean invocation
beanInvocation.setArgs(args);

// Set the bean invocation object as the message body
exchange.getIn().setBody(beanInvocation);

312.5.2. マルチパートレスポンス

マルチパート SOAP 応答には、SOAP 本体に要素が含まれる場合があり、SOAP ヘッダーに 1 つ以上の要素が含まれます。camel-soap DataFormat は、soap ボディー (存在する場合) の要素をアンマーシャルし、エクスチェンジの out メッセージのボディーに配置します。ヘッダー要素は、JAXB マップオブジェクトタイプにマーシャリング されません。代わりに、これらの要素は camel 出力メッセージヘッダー org.apache.camel.dataformat.soap.UNMARSHALLED_HEADER_LIST に配置されます。要素は、ignoreJAXBElement プロパティーの設定に応じて、要素インスタンス値または JAXBElement 値として表示されます。このプロパティーは camel-jaxb から継承されます。

また、ignoreUnmarshalledHeaders 値を true に設定することで、camel-soap DataFormate がヘッダーコンテンツをすべて無視するようにすることもできます。

312.5.3. ホルダーオブジェクトのマッピング

JAX-WS は、In/Out および Out パラメーターに対して型パラメーター化された javax.xml.ws.Holder オブジェクトの使用を指定します。BeanInvocation をビルドするときに Holder オブジェクトを使用するか、パラメーター化された型のインスタンスを直接使用することができます。camel-soap DataFormat は、 Holder の値クラスの JAXB マッピングに従って、Holder 値をマーシャリングします。アンマーシャリングされたレスポンス内の \'Holder オブジェクトには、マッピングが提供されません。