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