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
オブジェクトには、マッピングが提供されません。