此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Integration 6.3.1Spring中文文档

本节介绍如何转换 XML 有效负载Spring中文文档

将 Transformer 配置为 Bean

本节将解释以下转换器的工作原理以及如何将它们配置为 bean:Spring中文文档

所有 XML 转换器都扩展了 AbstractTransformerAbstractPayloadTransformer,因此实现了 Transformer。 在 Spring Integration 中将 XML 转换器配置为 bean 时,通常会将 与 MessageTransformingHandler 一起配置。 这样就可以将转换器用作端点。 最后,我们讨论命名空间支持,它允许将转换器配置为 XML 中的元素。TransformerSpring中文文档

UnmarshallingTransformer

UnmarshallingTransformer 允许使用 Spring OXM 的实现对 XML 进行解组。 Spring 的 Object/XML Mapping 支持提供了多种实现,这些实现支持使用 JAXBCastorJiBX 等进行编组和解编。 解组器需要 的实例。 如果消息负载不是 的实例,则仍会尝试转换。 目前支持 、 和 有效负载。 要创建到 的自定义转换,可以注入 SourceFactory 的实现。SourceUnmarshallerSourceSourceStringFilebyte[]org.w3c.dom.DocumentSourceSpring中文文档

如果未显式设置 ,则默认情况下,该属性设置为 DomSourceFactorySourceFactoryUnmarshallingTransformer

从版本 5.0 开始,还支持将 an 作为传入有效负载。 当我们通过 SOAP 接收带有 MTOM 附件的原始文件时,这可能很有用。 有关详细信息,请参阅 MTOM 支持UnmarshallingTransformerorg.springframework.ws.mime.MimeMessageWebServiceMessageSpring中文文档

下面的示例演示如何定义解组转换器:Spring中文文档

<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 允许使用 Spring OXM 将对象图转换为 XML 。 默认情况下,返回 . 但是,您可以通过配置替代项来控制结果的类型,例如 。 在许多情况下,将有效负载转换为替代 XML 格式会更方便。 为此,请配置 . Spring 集成提供了两个实现,一个是 转换为 的实现,另一个是转换为 的实现。 以下示例配置转换为文档的封送转换器:MarshallerMarshallingTransformerDomResultResultFactoryStringResultFactoryResultTransformerStringDocumentSpring中文文档

<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>

默认情况下,将有效负载对象传递给 . 但是,如果其 boolean 属性设置为 ,则整个实例将传递给 。 这对于接口的某些自定义实现可能很有用,但通常,当您委托给各种实现中的任何一个时,有效负载是用于封送的适当源对象。MarshallingTransformerMarshallerextractPayloadfalseMessageMarshallerMarshallerMarshallerSpring中文文档

XsltPayloadTransformer

XsltPayloadTransformer 使用可扩展样式表语言转换 (XSLT) 转换 XML 有效负载。 转换器的构造函数需要传入 ResourceTemplates 的实例。 传入实例允许对用于创建模板实例的实例进行更大的配置。TemplatesTransformerFactorySpring中文文档

UnmarshallingTransformer 一样,对 的实例执行实际的 XSLT 转换。 因此,如果消息负载不是 的实例,则仍会尝试转换。 并直接支持有效负载。XsltPayloadTransformerSourceSourceStringDocumentSpring中文文档

要创建到 的自定义转换,可以注入 SourceFactory 的实现。SourceSpring中文文档

如果未显式设置 a,则默认情况下,将 上的属性设置为 DomSourceFactorySourceFactoryXsltPayloadTransformer

默认情况下,会创建具有 Result 有效负载的消息,类似于 . 可以通过提供 ResultFactoryResultTransformer 来自定义此设置。XsltPayloadTransformerXmlPayloadMarshallingTransformerSpring中文文档

下面的示例配置一个用作 XSLT 有效负载转换器的 Bean:Spring中文文档

<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-classSpring中文文档

使用实现ResultTransformer

和 都允许您指定 ResultTransformer。 因此,如果封送处理或 XSLT 转换返回 Result,则还可以选择使用 a 将 转换为另一种格式。 Spring Integration 提供了两个具体的实现:MarshallingTransformerXsltPayloadTransformerResultTransformerResultResultTransformerSpring中文文档

默认情况下,始终返回 Result。 通过指定 ,您可以自定义返回的有效负载类型。MarshallingTransformerResultTransformerSpring中文文档

对于 . 默认情况下,如果输入有效负载是 或 的实例,则忽略该属性。XsltPayloadTransformerStringresultTransformerSpring中文文档

但是,如果输入有效负载是 Source 或任何其他类型,则应用该属性。 此外,还可以将该属性设置为 ,这也会导致使用指定的属性。resultTransformeralwaysUseResultFactorytrueresultTransformerSpring中文文档

有关详细信息和示例,请参阅命名空间配置和结果转换器Spring中文文档

如果未显式设置 ,则默认情况下,该属性设置为 DomSourceFactorySourceFactoryUnmarshallingTransformer
如果未显式设置 a,则默认情况下,将 上的属性设置为 DomSourceFactorySourceFactoryXsltPayloadTransformer

XML 转换器的命名空间支持

Spring Integration XML 命名空间中提供了对所有 XML 转换器的命名空间支持,前面显示了该命名空间的模板。 对转换器的命名空间支持根据提供的输入通道的类型创建 或 的实例。 命名空间支持旨在通过允许创建使用一个元素的终结点和转换器来减少 XML 配置量。EventDrivenConsumerPollingConsumerSpring中文文档

使用UnmarshallingTransformer

命名空间支持如下所示。 由于命名空间创建的是终结点实例而不是转换器,因此可以在元素中嵌套轮询器来控制输入通道的轮询。 以下示例演示如何执行此操作:UnmarshallingTransformerSpring中文文档

<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

封送转换器的命名空间支持需要 、 和 对 的引用。 您可以使用 optional 属性来控制创建的结果类型。 有效值为 or(默认值)。 以下示例配置接线变压器:input-channeloutput-channelmarshallerresult-typeStringResultDomResultSpring中文文档

<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"/>

如果提供的结果类型不足,则可以提供对自定义实现的引用,作为使用属性设置属性的替代方法。 和 属性是互斥的。ResultFactoryresult-typeresult-factoryresult-typeresult-factorySpring中文文档

在内部,和 result 类型分别由实现表示:StringResultFactoryDomResultFactoryStringResultDomResultResultFactory

使用XsltPayloadTransformer

命名空间支持允许您传入(以便创建 Templates 实例)或传入预先创建的实例作为引用。 与封送转换器一样,您可以通过指定 或 属性来控制结果输出的类型。 当需要在发送前转换结果时,可以使用属性来引用 的实现。XsltPayloadTransformerResourceTemplatesresult-factoryresult-typeresult-transformerResultTransformerSpring中文文档

如果指定 or 属性,则基础 XsltPayloadTransformer 上的属性由 XsltPayloadTransformerParser 设置为。result-factoryresult-typealwaysUseResultFactorytrue

下面的示例配置两个 XSLT 转换器:Spring中文文档

<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"/>

您可能需要有权访问数据(如标头),以便帮助进行转换。 例如,您可能需要访问某些标头,并将它们作为参数传递给转换器(例如,)。 Spring Integration 提供了两种方便的方法来实现此目的,如以下示例所示:MessageMessageMessagetransformer.setParameter(..)Spring中文文档

<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>

如果邮件头名称与参数名称一一对应,则可以使用该属性。 在其中,您可以使用通配符进行简单的模式匹配。 它支持以下简单模式样式:、*xxx 和 。xslt-param-headersxxx*xxxxxx*yyySpring中文文档

还可以使用该元素配置单个 XSLT 参数。 在该元素上,您可以设置属性或属性。 该属性应为任何有效的 SpEL 表达式,并且是表达式计算上下文的根对象。 该属性(与 Spring Bean 中的任何属性一样)允许您指定简单的标量值。 还可以使用属性占位符(如 )。 因此,使用 and 属性,可以将 XSLT 参数映射到 以及任何文本值的任何可访问部分。<xslt-param/>expressionvalueexpressionMessagevaluevalue${some.value}expressionvalueMessageSpring中文文档

从 Spring Integration 3.0 开始,您现在可以通过设置属性来指定 transformer 工厂类名称。transformer-factory-classSpring中文文档

在内部,和 result 类型分别由实现表示:StringResultFactoryDomResultFactoryStringResultDomResultResultFactory
如果指定 or 属性,则基础 XsltPayloadTransformer 上的属性由 XsltPayloadTransformerParser 设置为。result-factoryresult-typealwaysUseResultFactorytrue

命名空间配置和结果转换器

我们在使用 ResultTransformer 实现中介绍了如何使用结果转换器。 本节中的示例使用 XML 命名空间配置来说明几个特殊用例。 首先,我们定义 ,如以下示例所示:ResultTransformerSpring中文文档

<beans:bean id="resultToDoc" class="o.s.i.xml.transformer.ResultToDocumentTransformer"/>

这将接受 a 或 a 作为输入,并将输入转换为 .ResultTransformerStringResultDOMResultDocumentSpring中文文档

现在我们可以声明变压器,如下所示:Spring中文文档

<int-xml:xslt-transformer input-channel="in" output-channel="fahrenheitChannel"
    xsl-resource="classpath:noop.xslt" result-transformer="resultToDoc"/>

如果传入消息的有效负载类型为 ,则作为第一步,使用 确定 。 由于我们没有指定 ,因此使用默认值,这意味着转换将生成 .SourceResultResultFactoryResultFactoryDomResultFactoryDomResultSpring中文文档

但是,当我们指定 时,它被使用 ,并且生成的有效负载类型为 。ResultTransformerMessageDocumentSpring中文文档

指定的 或 payload 将忽略。 如果传入消息的有效负载类型为 ,则 XSLT 转换后的有效负载为 。 同样,如果传入消息的有效负载是 类型,则 XSLT 转换后的有效负载是“Document”。ResultTransformerStringDocumentStringStringDocument

如果消息有效负载不是 、 或 ,作为回退选项,我们尝试使用默认的 SourceFactory 创建一个“Source”。 由于我们没有使用该属性显式指定,因此使用默认的 DomSourceFactory。 如果成功,则执行 XSLT 转换,就像有效负载类型为 ,如前面的段落所述。SourceStringDocumentSourceFactorysource-factorySourceSpring中文文档

支持从 、 a 或 有效负载创建 a。DomSourceFactoryDOMSourceDocumentFileString

下一个转换器声明添加一个用作其值的属性。 在内部由 . 因此,您还可以通过使用属性来添加对 的引用,该属性本来是相同的。 以下示例演示了 transformer 声明:result-typeStringResultresult-typeStringResultFactoryStringResultFactoryresult-factorySpring中文文档

<int-xml:xslt-transformer input-channel="in" output-channel="fahrenheitChannel"
		xsl-resource="classpath:noop.xslt" result-transformer="resultToDoc"
		result-type="StringResult"/>

因为我们使用 ,所以类的属性被隐式设置为 。 因此,使用引用的。ResultFactoryalwaysUseResultFactoryXsltPayloadTransformertrueResultToDocumentTransformerSpring中文文档

因此,如果转换 类型的有效负载 ,则生成的有效负载类型为 DocumentStringSpring中文文档

[[xsltpayloadtransformer-and-<xsl:output-method=-text-/>]] === 和XsltPayloadTransformer<xsl:output method="text"/>Spring中文文档

<xsl:output method="text"/>指示 XSLT 模板仅生成来自输入源的文本内容。 在这种特殊情况下,我们没有理由使用 . 因此,XsltPayloadTransformer 默认为 if 基础的输出属性调用返回 。 此强制独立于入站有效负载类型执行。 此行为仅在设置组件的 if 属性或属性时可用。DomResultStringResultmethodjavax.xml.transform.Transformertextresult-typeresult-factory<int-xml:xslt-transformer>Spring中文文档

指定的 或 payload 将忽略。 如果传入消息的有效负载类型为 ,则 XSLT 转换后的有效负载为 。 同样,如果传入消息的有效负载是 类型,则 XSLT 转换后的有效负载是“Document”。ResultTransformerStringDocumentStringStringDocument
支持从 、 a 或 有效负载创建 a。DomSourceFactoryDOMSourceDocumentFileString