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 のインスタンスでない場合でも、変換は試行されます。現在、StringFilebyte[]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-channeloutput-channelmarshaller への参照が必要です。オプションの 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*xxxxxx*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` です。

メッセージペイロードが SourceStringDocument でない場合、フォールバックオプションとして、デフォルトの SourceFactory (Javadoc) を使用して `Source` を作成しようとします。source-factory 属性を使用して SourceFactory を明示的に指定しなかったため、デフォルトの DomSourceFactory (Javadoc) が使用されます。成功すると、前の段落で説明したように、ペイロードが Source 型であるかのように XSLT 変換が実行されます。

DomSourceFactory は、DocumentFileString ペイロードからの 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 属性を設定した場合にのみ使用可能です。