このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Integration 6.5.3 を使用してください! |
XML ペイロードの変換
このセクションでは、XML ペイロードを変換する方法について説明します
Transformers を Bean として構成する
このセクションでは、以下のトランスフォーマーの動作と、Bean として構成する方法について説明します。
すべての XML トランスフォーマーは AbstractTransformer (Javadoc) または AbstractPayloadTransformer (Javadoc) を継承するため、Transformer (Javadoc) を実装します。Spring Integration で XML トランスフォーマーを Bean として構成する場合、通常は MessageTransformingHandler (Javadoc) と組み合わせて Transformer を構成します。これにより、トランスフォーマーをエンドポイントとして使用できます。最後に、名前空間のサポートについて説明します。これにより、トランスフォーマーを XML の要素として構成できます。
UnmarshallingTransformer
UnmarshallingTransformer (Javadoc) を使用すると、Spring OXM Unmarshaller の実装を使用して、XML Source のマーシャリングを解除できます。Spring のオブジェクト / XML マッピングのサポートは、JAXB [Wikipedia] (英語) 、キャスター (英語) 、JiBX [Wikipedia] (英語) などを使用してマーシャリングとアンマーシャリングをサポートするいくつかの実装を提供します。アンマーシャラーには Source のインスタンスが必要です。メッセージペイロードが Source のインスタンスでない場合でも、変換は試行されます。現在、String、File、byte[]、org.w3c.dom.Document ペイロードがサポートされています。Source へのカスタム変換を作成するには、SourceFactory (Javadoc) の実装を挿入できます。
SourceFactory を明示的に設定しない場合、UnmarshallingTransformer のプロパティはデフォルトで DomSourceFactory (Javadoc) に設定されます。 |
バージョン 5.0 以降、UnmarshallingTransformer は受信ペイロードとして org.springframework.ws.mime.MimeMessage もサポートしています。これは、SOAP を介して MTOM 添付ファイル付きの生の WebServiceMessage を受信する場合に役立ちます。詳細については、MTOM サポートを参照してください。
次の例は、非整列化トランスフォーマーを定義する方法を示しています。
<bean id="unmarshallingTransformer" class="o.s.i.xml.transformer.UnmarshallingTransformer">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="org.example" />
</bean>
</constructor-arg>
</bean>MarshallingTransformer を使用する
MarshallingTransformer (Javadoc) では、Spring OXM Marshaller を使用してオブジェクトグラフを XML に変換できます。デフォルトでは、MarshallingTransformer は DomResult を返します。ただし、StringResultFactory などの代替 ResultFactory を構成することにより、結果の型を制御できます。多くの場合、ペイロードを別の XML 形式に変換する方が便利です。そのためには、ResultTransformer を構成します。Spring 統合は、String に変換するものと Document に変換するものの 2 つの実装を提供します。次の例では、ドキュメントに変換するマーシャリングトランスフォーマーを構成します。
<bean id="marshallingTransformer" class="o.s.i.xml.transformer.MarshallingTransformer">
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="contextPath" value="org.example"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="o.s.i.xml.transformer.ResultToDocumentTransformer"/>
</constructor-arg>
</bean> デフォルトでは、MarshallingTransformer はペイロードオブジェクトを Marshaller に渡します。ただし、ブール値の extractPayload プロパティが false に設定されている場合、Message インスタンス全体が代わりに Marshaller に渡されます。これは、Marshaller インターフェースの特定のカスタム実装に役立つ場合がありますが、通常、ペイロードは、さまざまな Marshaller 実装のいずれかに委譲する場合のマーシャリングに適したソースオブジェクトです。
XsltPayloadTransformer
XsltPayloadTransformer (Javadoc) は、拡張可能なスタイルシート言語変換 [Wikipedia] (英語) (XSLT)を使用して XML ペイロードを変換します。トランスフォーマーのコンストラクターには、リソース (Javadoc) またはテンプレート (標準 Javadoc) (英語) のいずれかのインスタンスを渡す必要があります。Templates インスタンスを渡すことで、テンプレートインスタンスの作成に使用する TransformerFactory をさらに構成できます。
UnmarshallingTransformer と同様に、XsltPayloadTransformer は Source のインスタンスに対して実際の XSLT 変換を行います。メッセージペイロードが Source のインスタンスではない場合、変換は引き続き試行されます。String および Document ペイロードは直接サポートされています。
Source へのカスタム変換を作成するには、SourceFactory (Javadoc) の実装を注入できます。
SourceFactory が明示的に設定されていない場合、XsltPayloadTransformer のプロパティはデフォルトで DomSourceFactory (Javadoc) に設定されます。 |
デフォルトでは、XsltPayloadTransformer は XmlPayloadMarshallingTransformer と同様に、Result (標準 Javadoc) (英語) ペイロードを持つメッセージを作成します。ResultFactory (Javadoc) または ResultTransformer (Javadoc) を提供することにより、これをカスタマイズできます。
次の例では、XSLT ペイロードトランスフォーマーとして機能する Bean を構成します。
<bean id="xsltPayloadTransformer" class="o.s.i.xml.transformer.XsltPayloadTransformer">
<constructor-arg value="classpath:org/example/xsl/transform.xsl"/>
<constructor-arg>
<bean class="o.s.i.xml.transformer.ResultToDocumentTransformer"/>
</constructor-arg>
</bean>Spring Integration 3.0 以降では、コンストラクター引数を使用して、トランスフォーマーファクトリクラス名を指定できます。これは、名前空間を使用するときに transformer-factory-class 属性を使用して行うことができます。
ResultTransformer 実装の使用
MarshallingTransformer と XsltPayloadTransformer の両方で、ResultTransformer (Javadoc) を指定できます。マーシャリングまたは XSLT 変換が Result (標準 Javadoc) (英語) を返す場合、ResultTransformer を使用して Result を別の形式に変換するオプションもあります。Spring Integration は、2 つの具体的な ResultTransformer 実装を提供します。
デフォルトでは、MarshallingTransformer は常に Result (標準 Javadoc) (英語) を返します。ResultTransformer を指定することにより、返されるペイロードの型をカスタマイズできます。
XsltPayloadTransformer の動作はやや複雑です。デフォルトでは、入力ペイロードが String または Document (標準 Javadoc) (英語) のインスタンスである場合、resultTransformer プロパティは無視されます。
ただし、入力ペイロードが Source (標準 Javadoc) (英語) またはその他の型の場合、resultTransformer プロパティが適用されます。さらに、alwaysUseResultFactory プロパティを true に設定できます。これにより、指定された resultTransformer も使用されます。
詳細および例については、名前空間の構成と結果 Transformers を参照してください。
XMLTransformers のネームスペースサポート
Namespace support for all XML transformers is provided in the Spring Integration XML namespace, a template for which was shown earlier. The namespace support for transformers creates an instance of either EventDrivenConsumer or PollingConsumer, according to the type of the provided input channel. The namespace support is designed to reduce the amount of XML configuration by allowing the creation of an endpoint and transformer that use one element.
UnmarshallingTransformer を使用する
UnmarshallingTransformer の名前空間サポートを以下に示します。名前空間はトランスフォーマーではなくエンドポイントインスタンスを作成するため、要素内にポーラーをネストして入力チャネルのポーリングを制御できます。次の例は、その方法を示しています。
<int-xml:unmarshalling-transformer id="defaultUnmarshaller"
input-channel="input" output-channel="output"
unmarshaller="unmarshaller"/>
<int-xml:unmarshalling-transformer id="unmarshallerWithPoller"
input-channel="input" output-channel="output"
unmarshaller="unmarshaller">
<int:poller fixed-rate="2000"/>
<int-xml:unmarshalling-transformer/>MarshallingTransformer を使用する
マーシャリングトランスフォーマーの名前空間サポートには、input-channel、output-channel、marshaller への参照が必要です。オプションの result-type 属性を使用して、作成される結果の型を制御できます。有効な値は StringResult または DomResult (デフォルト)です。次の例では、マーシャリングトランスフォーマーを構成します。
<int-xml:marshalling-transformer
input-channel="marshallingTransformerStringResultFactory"
output-channel="output"
marshaller="marshaller"
result-type="StringResult" />
<int-xml:marshalling-transformer
input-channel="marshallingTransformerWithResultTransformer"
output-channel="output"
marshaller="marshaller"
result-transformer="resultTransformer" />
<bean id="resultTransformer" class="o.s.i.xml.transformer.ResultToStringTransformer"/> 提供された結果型では不十分な場合、result-factory 属性を使用して result-type 属性を設定する代わりに、ResultFactory のカスタム実装への参照を提供できます。result-type 属性と result-factory 属性は相互に排他的です。
内部的に、StringResult および DomResult の結果型は、それぞれ ResultFactory の実装(StringResultFactory (Javadoc) および DomResultFactory (Javadoc) )で表されます。 |
XsltPayloadTransformer を使用する
XsltPayloadTransformer の名前空間サポートにより、Resource を渡す(Templates (標準 Javadoc) (英語) インスタンスを作成するため)か、事前に作成された Templates インスタンスを参照として渡すことができます。マーシャリングトランスフォーマーと同様に、result-factory または result-type 属性を指定することで、結果出力の型を制御できます。結果を送信前に変換する必要がある場合は、result-transformer 属性を使用して ResultTransformer の実装を参照できます。
result-factory または result-type 属性を指定すると、基になる XsltPayloadTransformer (Javadoc) の alwaysUseResultFactory プロパティは XsltPayloadTransformerParser (Javadoc) によって true に設定されます。 |
次の例では、2 つの XSLT トランスフォーマーを構成します。
<int-xml:xslt-transformer id="xsltTransformerWithResource"
input-channel="withResourceIn" output-channel="output"
xsl-resource="org/springframework/integration/xml/config/test.xsl"/>
<int-xml:xslt-transformer id="xsltTransformerWithTemplatesAndResultTransformer"
input-channel="withTemplatesAndResultTransformerIn" output-channel="output"
xsl-templates="templates"
result-transformer="resultTransformer"/> 変換を支援するために、Message ヘッダーなどの Message データへのアクセスが必要になる場合があります。たとえば、特定の Message ヘッダーにアクセスし、transformer.setParameter(..) などのトランスフォーマーにパラメーターとして渡す必要がある場合があります。Spring Integration には、次の例に示すように、これを実現するための便利な方法が 2 つ用意されています。
<int-xml:xslt-transformer id="paramHeadersCombo"
input-channel="paramHeadersComboChannel" output-channel="output"
xsl-resource="classpath:transformer.xslt"
xslt-param-headers="testP*, *foo, bar, baz">
<int-xml:xslt-param name="helloParameter" value="hello"/>
<int-xml:xslt-param name="firstName" expression="headers.fname"/>
</int-xml:xslt-transformer> メッセージヘッダー名がパラメーター名と 1 対 1 で一致する場合は、xslt-param-headers 属性を使用できます。その中で、単純なパターンマッチングにワイルドカードを使用できます。次の単純なパターンスタイルをサポートします: xxx*、xxx、*xxx、xxx*yyy。
<xslt-param/> 要素を使用して、個々の XSLT パラメーターを構成することもできます。その要素で、expression 属性または value 属性を設定できます。expression 属性は、Message が式評価コンテキストのルートオブジェクトである有効な SpEL 式でなければなりません。value 属性(Spring Bean の value と同様)を使用すると、単純なスカラー値を指定できます。プロパティプレースホルダー(${some.value} など)を使用することもできます。expression および value 属性を使用すると、XSLT パラメーターを Message のアクセス可能な部分およびリテラル値にマップできます。
Spring Integration 3.0 から、transformer-factory-class 属性を設定することにより、トランスフォーマファクトリクラス名を指定できるようになりました。
名前空間の構成と結果 Transformers
We cover using result transformers in ResultTransformer 実装の使用 . The examples in this section use XML namespace configuration to illustrate several special use cases. First, we define the ResultTransformer, as the following example shows:
<beans:bean id="resultToDoc" class="o.s.i.xml.transformer.ResultToDocumentTransformer"/> この ResultTransformer は、入力として StringResult または DOMResult を受け入れ、入力を Document に変換します。
Now we can declare the transformer as follows:
<int-xml:xslt-transformer input-channel="in" output-channel="fahrenheitChannel"
xsl-resource="classpath:noop.xslt" result-transformer="resultToDoc"/> 受信メッセージのペイロードの型が Source である場合、最初のステップとして、Result は ResultFactory を使用して決定されます。ResultFactory を指定しなかったため、デフォルトの DomResultFactory が使用されます。つまり、変換により DomResult が生成されます。
ただし、ResultTransformer を指定したため、それが使用され、結果の Message ペイロードは型 Document になります。
指定された ResultTransformer は、String または Document ペイロードでは無視されます。受信メッセージのペイロードの型が String の場合、XSLT 変換後のペイロードは String です。同様に、受信メッセージのペイロードの型が Document の場合、XSLT 変換後のペイロードは `Document` です。 |
メッセージペイロードが Source、String、Document でない場合、フォールバックオプションとして、デフォルトの SourceFactory (Javadoc) を使用して `Source` を作成しようとします。source-factory 属性を使用して SourceFactory を明示的に指定しなかったため、デフォルトの DomSourceFactory (Javadoc) が使用されます。成功すると、前の段落で説明したように、ペイロードが Source 型であるかのように XSLT 変換が実行されます。
DomSourceFactory は、Document、File、String ペイロードからの DOMSource の作成をサポートします。 |
次のトランスフォーマ宣言は、値として StringResult を使用する result-type 属性を追加します。result-type は、StringResultFactory によって内部的に表されます。result-factory 属性を使用して StringResultFactory への参照を追加することもできますが、これは同じでした。次の例は、そのトランスフォーマ宣言を示しています。
<int-xml:xslt-transformer input-channel="in" output-channel="fahrenheitChannel"
xsl-resource="classpath:noop.xslt" result-transformer="resultToDoc"
result-type="StringResult"/>ResultFactory を使用するため、XsltPayloadTransformer クラスの alwaysUseResultFactory プロパティは暗黙的に true に設定されます。参照される ResultToDocumentTransformer が使用されます。
型 String のペイロードを変換すると、結果のペイロードは型 Document (標準 Javadoc) (英語) になります。
XsltPayloadTransformer および <xsl:output method="text"/>
<xsl:output method="text"/> tells the XSLT template to produce only text content from the input source. In this particular case, we have no reason to use a DomResult. Therefore, the XsltPayloadTransformer (Javadoc) defaults to StringResult if the output property (標準 Javadoc) (英語) called method of the underlying javax.xml.transform.Transformer returns text. This coercion is performed independently of the inbound payload type. This behavior is available only if the result-type attribute or the result-factory attribute for the <int-xml:xslt-transformer> component is set.