转换 XML 有效负载
本节介绍如何转换 XML 负载
将 Transformer 配置为 Bean
本节将解释以下转换器的工作原理以及如何将它们配置为 bean:
所有 XML 转换器都扩展了AbstractTransformer
或AbstractPayloadTransformer
并因此实施Transformer
.
在 Spring 集成中将 XML 转换器配置为 bean 时,通常会将Transformer
与MessageTransformingHandler
.
这允许将转换器用作终端节点。
最后,我们讨论命名空间支持,它允许将转换器配置为 XML 中的元素。
解组转换器
一UnmarshallingTransformer
让 XMLSource
通过使用 Spring OXM 的实现进行解组 Unmarshaller
.
Spring 的 Object/XML Mapping 支持提供了多种实现,这些实现通过使用 JAXB、Castor、JiBX 等支持编组和解组。
解组器需要Source
.
如果消息负载不是Source
,仍会尝试转换。
现在String
,File
,byte[]
和org.w3c.dom.Document
支持有效负载。
要创建到Source
中,您可以注入SourceFactory
.
如果您没有显式设置SourceFactory ,则UnmarshallingTransformer 设置为DomSourceFactory . |
从版本 5.0 开始,UnmarshallingTransformer
还支持org.springframework.ws.mime.MimeMessage
作为传入的负载。
当我们收到 raw 时,这可能很有用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
payloads 直接受支持。
要创建到Source
中,您可以注入SourceFactory
.
如果SourceFactory 未显式设置,则XsltPayloadTransformer 设置为DomSourceFactory . |
默认情况下,XsltPayloadTransformer
创建一条消息Result
payload 的 intent 与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 集成提供了两个具体的ResultTransformer
实现:
默认情况下,MarshallingTransformer
始终返回Result
.
通过指定ResultTransformer
中,您可以自定义返回的负载类型。
对于XsltPayloadTransformer
.
默认情况下,如果输入有效负载是String
或Document
这resultTransformer
属性被忽略。
但是,如果输入负载是Source
或任何其他类型,resultTransformer
属性。
此外,您还可以设置alwaysUseResultFactory
property 设置为true
,这也会导致指定的resultTransformer
以供使用。
有关更多信息和示例,请参阅命名空间配置和结果转换器。
XML 转换器的命名空间支持
Spring 集成 XML 名称空间中提供了对所有 XML 转换器的名称空间支持,前面显示了该名称空间的模板。
对 transformers 的命名空间支持会创建一个EventDrivenConsumer
或PollingConsumer
,具体取决于提供的输入通道的类型。
命名空间支持旨在通过允许创建使用一个元素的端点和转换器来减少 XML 配置的数量。
使用UnmarshallingTransformer
命名空间对UnmarshallingTransformer
如下所示。
由于命名空间创建的是端点实例而不是转换器,因此您可以在元素中嵌套 Poller 来控制 input 通道的轮询。
以下示例显示了如何执行此作:
<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 result 类型由ResultFactory 实现:StringResultFactory 和DomResultFactory 分别。 |
使用XsltPayloadTransformer
命名空间支持XsltPayloadTransformer
允许您传入Resource
(为了创建Templates
实例)或传入预先创建的Templates
实例作为参考。
与编组转换器一样,您可以通过指定result-factory
或result-type
属性。
当您需要在发送前转换结果时,您可以使用result-transformer
attribute 来引用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
headers 来协助转换。
例如,您可能需要访问某些Message
headers 并将它们作为参数传递给转换器(例如transformer.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>
如果消息标头名称与参数名称一一匹配,则可以使用xslt-param-headers
属性。
在该文档中,您可以使用通配符进行简单的模式匹配。
它支持以下简单的模式样式:xxx*
,xxx
,*xxx
和xxx*yyy
.
您还可以使用<xslt-param/>
元素。
在该元素上,您可以设置expression
属性或value
属性。
这expression
属性应该是任何有效的 SPEL 表达式,其中Message
作为 expression 求值上下文的根对象。
这value
属性(与任何value
)允许您指定简单的标量值。
您还可以使用属性占位符(例如${some.value}
).
因此,使用expression
和value
属性,您可以将 XSLT 参数映射到Message
以及任何 Literal 值。
从 Spring Integration 3.0 开始,你现在可以通过在 3.0 中设置transformer-factory-class
属性。
命名空间配置和结果转换器
我们介绍了 result transformer 的使用用ResultTransformer
实现.
本节中的示例使用 XML 命名空间配置来说明几个特殊用例。
首先,我们定义ResultTransformer
,如下例所示:
<beans:bean id="resultToDoc" class="o.s.i.xml.transformer.ResultToDocumentTransformer"/>
这ResultTransformer
接受StringResult
或DOMResult
作为 input 进行转换,并将 input 转换为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
payload 的类型为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>
元件。