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 のネームスペースサポート
すべての XML トランスフォーマーの名前空間サポートは、Spring Integration XML 名前空間で提供されます。このテンプレートのテンプレートは前に示しました。トランスフォーマーの名前空間サポートは、提供された入力チャネルの型に応じて、EventDrivenConsumer
または PollingConsumer
のいずれかのインスタンスを作成します。名前空間のサポートは、1 つの要素を使用するエンドポイントとトランスフォーマーの作成を許可することにより、XML 構成の量を減らすように設計されています。
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
ResultTransformer
実装の使用での結果トランスフォーマーの使用について説明します。このセクションの例では、XML 名前空間の構成を使用して、いくつかの特別な使用例を示しています。最初に、次の例に示すように ResultTransformer
を定義します。
<beans:bean id="resultToDoc" class="o.s.i.xml.transformer.ResultToDocumentTransformer"/>
この ResultTransformer
は、入力として StringResult
または DOMResult
を受け入れ、入力を Document
に変換します。
次のように、トランスフォーマーを宣言できます。
<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-and-<xsl:output-method=-text-/>]] === XsltPayloadTransformer
および <xsl:output method="text"/>
<xsl:output method="text"/>
は、入力ソースからテキストコンテンツのみを生成するように XSLT テンプレートに指示します。この特定のケースでは、DomResult
を使用する理由はありません。基になる javax.xml.transform.Transformer
の method
と呼ばれる出力プロパティ (標準 Javadoc) (英語) が text
を返す場合、XsltPayloadTransformer
(Javadoc) は StringResult
にデフォルト設定されます。この強制は、受信ペイロード型とは独立して実行されます。この動作は、<int-xml:xslt-transformer>
コンポーネントの result-type
属性または result-factory
属性を設定した場合にのみ使用可能です。