|
对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
转换 XML 有效负载
本节介绍如何转换 XML 有效负载
将 Transformer 配置为 Bean
本节将解释以下 transformer 的工作原理以及如何将它们配置为 bean:
所有 XML 转换器都扩展了AbstractTransformer或AbstractPayloadTransformer因此实施Transformer.
在 Spring Integration 中将 XML 转换器配置为 bean 时,您通常会配置Transformer结合MessageTransformingHandler.
这允许将转换器用作端点。
最后,我们讨论命名空间支持,它允许将转换器配置为 XML 中的元素。
UnmarshallingTransformer
一UnmarshallingTransformer让 XMLSource通过使用 Spring OXM 的实现进行解组 Unmarshaller.
Spring 的 Object/XML Mapping 支持提供了多种实现,这些实现支持使用 JAXB、Castor、JiBX 等进行编组和解编。
unmarshaller 需要一个Source.
如果消息有效负载不是Source,仍在尝试转换。
现在String,File,byte[]和org.w3c.dom.Document支持有效负载。
要创建自定义转换为Source,您可以注入一个SourceFactory.
如果您没有显式设置SourceFactory,则UnmarshallingTransformer默认情况下,设置为DomSourceFactory. |
从 5.0 版开始,UnmarshallingTransformer还支持org.springframework.ws.mime.MimeMessage作为传入的有效载荷。
当我们收到原始WebServiceMessage通过 SOAP 使用 MTOM 附件。
有关详细信息,请参阅 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允许使用 Spring OXM 将对象图转换为 XMLMarshaller.
默认情况下,MarshallingTransformer返回一个DomResult.
但是,您可以通过配置替代项来控制结果的类型ResultFactory如StringResultFactory.
在许多情况下,将有效负载转换为替代 XML 格式更方便。
为此,请配置ResultTransformer.
Spring 集成提供了两种实现,一种转换为String另一个转换为Document.
以下示例配置转换为文档的封送转换器:
<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实现。
XsltPayloadTransformer
这XsltPayloadTransformer使用可扩展样式表语言转换 (XSLT) 转换 XML 有效负载。
转换器的构造函数需要传入 Resource 或 Templates 的实例。
传入Templates实例允许对TransformerFactory用于创建模板实例。
与UnmarshallingTransformer这XsltPayloadTransformer对Source.
因此,如果消息有效负载不是Source,仍在尝试转换。String和Document直接支持有效负载。
要创建自定义转换为Source,您可以注入一个SourceFactory.
如果SourceFactory未显式设置,则XsltPayloadTransformer默认情况下,设置为DomSourceFactory. |
默认情况下,XsltPayloadTransformer使用Result有效负载,类似于XmlPayloadMarshallingTransformer.
您可以通过提供ResultFactory或ResultTransformer.
以下示例配置了一个用作 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.
因此,如果封送处理或 XSLT 转换返回Result,您还可以选择使用ResultTransformer将Result转换为另一种格式。
Spring Integration 提供了两个具体的ResultTransformer实现:
默认情况下,MarshallingTransformer总是返回一个Result.
通过指定ResultTransformer,您可以自定义返回的有效负载类型。
对于XsltPayloadTransformer.
默认情况下,如果输入有效负载是String或Document这resultTransformer属性被忽略。
但是,如果输入有效负载是Source或任何其他类型,resultTransformer属性。
此外,您可以将alwaysUseResultFactory属性设置为true,这也会导致指定的resultTransformer待使用。
有关详细信息和示例,请参阅命名空间配置和结果转换器。
XML 转换器的命名空间支持
Spring Integration XML 命名空间中提供了对所有 XML 转换器的命名空间支持,前面显示了该模板的模板。
对 transformer 的命名空间支持会创建一个实例EventDrivenConsumer或PollingConsumer,根据提供的输入通道的类型。
命名空间支持旨在通过允许创建使用一个元素的端点和转换器来减少 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"/>
如果提供的结果类型不够,则可以提供对ResultFactory作为将result-type属性,使用result-factory属性。
这result-type和result-factory属性是互斥的。
在内部,StringResult和DomResult结果类型由ResultFactory实现:StringResultFactory和DomResultFactory分别。 |
使用XsltPayloadTransformer
命名空间支持XsltPayloadTransformer让您传入Resource(为了创建Templatesinstance)或传入预先创建的Templates实例作为参考。
与封送转换器一样,可以通过指定result-factory或result-type属性。
当您需要在发送前转换结果时,您可以使用result-transformer属性来引用ResultTransformer.
如果指定result-factory或result-type属性,则alwaysUseResultFactory基础上的属性XsltPayloadTransformer设置为true通过XsltPayloadTransformerParser. |
以下示例配置两个 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 提供了两种方便的方法来实现这一点,如以下示例所示:
<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,*xxx和xxx*yyy.
您还可以使用<xslt-param/>元素。
在该元素上,您可以将expression属性或value属性。
这expression属性应该是任何有效的 SpEL 表达式,其中Message作为表达式求值上下文的根对象。
这value属性(与任何value在 Spring bean 中)允许您指定简单的标量值。
您还可以使用属性占位符(例如${some.value}).
因此,使用expression和value属性,您可以将 XSLT 参数映射到Message以及任何文字值。
从 Spring Integration 3.0 开始,您现在可以通过设置transformer-factory-class属性。
命名空间配置和结果转换器
我们在用ResultTransformer实现.
本节中的示例使用 XML 命名空间配置来说明几个特殊用例。
首先,我们将ResultTransformer,如以下示例所示:
<beans:bean id="resultToDoc" class="o.s.i.xml.transformer.ResultToDocumentTransformer"/>
这ResultTransformer接受StringResult或DOMResult作为输入,并将输入转换为Document.
现在我们可以声明 transformer,如下所示:
<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.
由于我们没有指定SourceFactory显式地使用source-factory属性,默认DomSourceFactory。如果成功,则执行 XSLT 转换,就好像有效负载的类型为Source,如前几段所述。
这DomSourceFactory支持创建DOMSource从Document一个File或String有效载荷。 |
下一个 transformer 声明将result-type使用StringResult作为其价值。 这result-type在内部由StringResultFactory. 因此,您还可以添加对StringResultFactory,通过使用result-factory属性,这将是相同的。以下示例显示了 transformer 声明:
<int-xml:xslt-transformer input-channel="in" output-channel="fahrenheitChannel"
xsl-resource="classpath:noop.xslt" result-transformer="resultToDoc"
result-type="StringResult"/>
因为我们使用ResultFactory这alwaysUseResultFactory属性的XsltPayloadTransformerclass 被隐式设置为true. 因此,引用的ResultToDocumentTransformer被使用。
因此,如果将类型为String,生成的有效负载类型为Document.
[[xsltpayloadtransformer-and-<xsl:output-method=-text-/>]] ===XsltPayloadTransformer和<xsl:output method="text"/>
<xsl:output method="text"/>告诉 XSLT 模板仅从输入源生成文本内容。在这种特殊情况下,我们没有理由使用DomResult. 因此,XsltPayloadTransformer默认为StringResult如果输出属性调用method的javax.xml.transform.Transformer返回text. 此强制独立于入站有效负载类型执行。此行为仅适用于您设置的result-type属性或result-factory属性的<int-xml:xslt-transformer>元件。