对于最新的稳定版本,请使用 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
(为了创建Templates
instance)或传入预先创建的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
属性的XsltPayloadTransformer
class 被隐式设置为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>
元件。