转换 XML 有效负载

本节介绍如何转换 XML 负载spring-doc.cadn.net.cn

将 Transformer 配置为 Bean

本节将解释以下转换器的工作原理以及如何将它们配置为 bean:spring-doc.cadn.net.cn

所有 XML 转换器都扩展了AbstractTransformerAbstractPayloadTransformer并因此实施Transformer. 在 Spring 集成中将 XML 转换器配置为 bean 时,通常会将TransformerMessageTransformingHandler. 这允许将转换器用作终端节点。 最后,我们讨论命名空间支持,它允许将转换器配置为 XML 中的元素。spring-doc.cadn.net.cn

解组转换器

UnmarshallingTransformer让 XMLSource通过使用 Spring OXM 的实现进行解组 Unmarshaller. Spring 的 Object/XML Mapping 支持提供了多种实现,这些实现通过使用 JAXBCastorJiBX 等支持编组和解组。 解组器需要Source. 如果消息负载不是Source,仍会尝试转换。 现在String,File,byte[]org.w3c.dom.Document支持有效负载。 要创建到Source中,您可以注入SourceFactory.spring-doc.cadn.net.cn

如果您没有显式设置SourceFactory,则UnmarshallingTransformer设置为DomSourceFactory.

从版本 5.0 开始,UnmarshallingTransformer还支持org.springframework.ws.mime.MimeMessage作为传入的负载。 当我们收到 raw 时,这可能很有用WebServiceMessage通过 SOAP 使用 MTOM 附件。 有关更多信息,请参阅 MTOM 支持spring-doc.cadn.net.cn

以下示例显示如何定义解组转换器:spring-doc.cadn.net.cn

<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 将对象图转换为 XMLMarshaller. 默认情况下,MarshallingTransformer返回DomResult. 但是,您可以通过配置替代项来控制结果的类型ResultFactoryStringResultFactory. 在许多情况下,将有效负载转换为替代 XML 格式会更方便。 为此,请配置ResultTransformer. Spring 集成提供了两种实现,一种转换为String另一个转换为Document. 下面的示例配置一个转换为文档的编组转换器:spring-doc.cadn.net.cn

<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将 payload 对象传递给Marshaller. 但是,如果其布尔值extractPayload属性设置为false,则整个Message实例传递给Marshaller相反。 这对于Marshaller接口,但通常,当您委托给各种Marshaller实现。spring-doc.cadn.net.cn

XsltPayloadTransformer

XsltPayloadTransformer使用可扩展样式表语言转换 (XSLT) 转换 XML 负载。 转换器的构造函数需要传入 ResourceTemplates 的实例。 传入Templates实例允许对TransformerFactory用于创建模板实例。spring-doc.cadn.net.cn

UnmarshallingTransformerXsltPayloadTransformerSource. 因此,如果消息有效负载不是Source,仍会尝试转换。StringDocumentpayloads 直接受支持。spring-doc.cadn.net.cn

要创建到Source中,您可以注入SourceFactory.spring-doc.cadn.net.cn

如果SourceFactory未显式设置,则XsltPayloadTransformer设置为DomSourceFactory.

默认情况下,XsltPayloadTransformer创建一条消息Resultpayload 的 intent 与XmlPayloadMarshallingTransformer. 您可以通过提供ResultFactoryResultTransformer.spring-doc.cadn.net.cn

以下示例配置一个用作 XSLT 有效负载转换器的 Bean:spring-doc.cadn.net.cn

<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属性。spring-doc.cadn.net.cn

ResultTransformer实现

MarshallingTransformerXsltPayloadTransformer让您指定一个ResultTransformer. 因此,如果封送处理或 XSLT 转换返回Result,您还可以选择使用ResultTransformer要转换Result转换为另一种格式。 Spring 集成提供了两个具体的ResultTransformer实现:spring-doc.cadn.net.cn

默认情况下,MarshallingTransformer始终返回Result. 通过指定ResultTransformer中,您可以自定义返回的负载类型。spring-doc.cadn.net.cn

对于XsltPayloadTransformer. 默认情况下,如果输入有效负载是StringDocumentresultTransformer属性被忽略。spring-doc.cadn.net.cn

但是,如果输入负载是Source或任何其他类型,resultTransformer属性。 此外,您还可以设置alwaysUseResultFactoryproperty 设置为true,这也会导致指定的resultTransformer以供使用。spring-doc.cadn.net.cn

有关更多信息和示例,请参阅命名空间配置和结果转换器spring-doc.cadn.net.cn

XML 转换器的命名空间支持

Spring 集成 XML 名称空间中提供了对所有 XML 转换器的名称空间支持,前面显示了该名称空间的模板。 对 transformers 的命名空间支持会创建一个EventDrivenConsumerPollingConsumer,具体取决于提供的输入通道的类型。 命名空间支持旨在通过允许创建使用一个元素的端点和转换器来减少 XML 配置的数量。spring-doc.cadn.net.cn

使用UnmarshallingTransformer

命名空间对UnmarshallingTransformer如下所示。 由于命名空间创建的是端点实例而不是转换器,因此您可以在元素中嵌套 Poller 来控制 input 通道的轮询。 以下示例显示了如何执行此作:spring-doc.cadn.net.cn

<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-channel和对marshaller. 您可以使用可选的result-type属性来控制创建的结果类型。 有效值为StringResultDomResult(默认值)。 以下示例配置编组转换器:spring-doc.cadn.net.cn

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

如果提供的结果类型不够用,则可以提供对ResultFactory作为设置result-type属性result-factory属性。 这result-typeresult-factory属性是互斥的。spring-doc.cadn.net.cn

在内部,StringResultDomResultresult 类型由ResultFactory实现:StringResultFactoryDomResultFactory分别。

使用XsltPayloadTransformer

命名空间支持XsltPayloadTransformer允许您传入Resource(为了创建Templates实例)或传入预先创建的Templates实例作为参考。 与编组转换器一样,您可以通过指定result-factoryresult-type属性。 当您需要在发送前转换结果时,您可以使用result-transformerattribute 来引用ResultTransformer.spring-doc.cadn.net.cn

如果指定result-factoryresult-type属性、alwaysUseResultFactory底层XsltPayloadTransformer设置为trueXsltPayloadTransformerParser.

以下示例配置两个 XSLT 转换器:spring-doc.cadn.net.cn

<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数据,例如Messageheaders 来协助转换。 例如,您可能需要访问某些Messageheaders 并将它们作为参数传递给转换器(例如transformer.setParameter(..)). Spring 集成提供了两种便捷的方法来实现这一目标,如下例所示:spring-doc.cadn.net.cn

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

如果消息标头名称与参数名称一一匹配,则可以使用xslt-param-headers属性。 在该文档中,您可以使用通配符进行简单的模式匹配。 它支持以下简单的模式样式:xxx*,xxx,*xxxxxx*yyy.spring-doc.cadn.net.cn

您还可以使用<xslt-param/>元素。 在该元素上,您可以设置expression属性或value属性。 这expression属性应该是任何有效的 SPEL 表达式,其中Message作为 expression 求值上下文的根对象。 这value属性(与任何value)允许您指定简单的标量值。 您还可以使用属性占位符(例如${some.value}). 因此,使用expressionvalue属性,您可以将 XSLT 参数映射到Message以及任何 Literal 值。spring-doc.cadn.net.cn

从 Spring Integration 3.0 开始,你现在可以通过在 3.0 中设置transformer-factory-class属性。spring-doc.cadn.net.cn

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

我们介绍了 result transformer 的使用ResultTransformer实现. 本节中的示例使用 XML 命名空间配置来说明几个特殊用例。 首先,我们定义ResultTransformer,如下例所示:spring-doc.cadn.net.cn

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

ResultTransformer接受StringResultDOMResult作为 input 进行转换,并将 input 转换为Document.spring-doc.cadn.net.cn

现在我们可以声明 transformer,如下所示:spring-doc.cadn.net.cn

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

如果传入消息的有效负载的类型为Source,然后,作为第一步,Result通过使用ResultFactory. 由于我们没有指定ResultFactory,则默认的DomResultFactory,这意味着转换会生成一个DomResult.spring-doc.cadn.net.cn

但是,由于我们指定了ResultTransformer,则使用它,并且生成的Messagepayload 的类型为Document.spring-doc.cadn.net.cn

指定的ResultTransformer被忽略,替换为StringDocument负载。 如果传入消息的有效负载的类型为String,则 XSLT 转换后的有效负载是String. 同样,如果传入消息的有效负载的类型为Document,则 XSLT 转换后的有效负载为“Document”。

如果消息负载不是Source一个StringDocument作为后备选项,我们尝试使用默认的SourceFactory. 由于我们没有指定SourceFactory通过使用source-factory属性,则默认的DomSourceFactory被使用。 如果成功,则执行 XSLT 转换,就像有效负载的类型为Source,如前几段所述。spring-doc.cadn.net.cn

DomSourceFactory支持创建DOMSourceDocument一个FileString有效载荷。

下一个 transformer 声明添加了一个result-type属性,该属性使用StringResult作为其值。 这result-type在内部由StringResultFactory. 因此,您还可以添加对StringResultFactory,通过使用result-factory属性,这将是相同的。 以下示例显示了 transformer 声明:spring-doc.cadn.net.cn

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

因为我们使用ResultFactoryalwaysUseResultFactory属性的XsltPayloadTransformerclass 隐式设置为true. 因此,引用的ResultToDocumentTransformer被使用。spring-doc.cadn.net.cn

因此,如果您转换String,则生成的有效负载的类型为Document.spring-doc.cadn.net.cn

[[xsltpayloadtransformer-and-<xsl:output-method=-text-/>]] ===XsltPayloadTransformer<xsl:output method="text"/>spring-doc.cadn.net.cn

<xsl:output method="text"/>指示 XSLT 模板仅从输入源生成文本内容。 在这种特殊情况下,我们没有理由使用DomResult. 因此,XsltPayloadTransformer默认为StringResult如果名为method底层证券javax.xml.transform.Transformer返回text. 此强制执行独立于入站有效负载类型。 此行为仅可用,前提是您在result-type属性或result-factory属性<int-xml:xslt-transformer>元件。spring-doc.cadn.net.cn