|
对于最新稳定版本,请使用 Spring Integration 7.0.0! |
XML有效载荷的转换
本节介绍如何转换XML负载
将转换器配置为豆子
本节将解释以下转换器的工作原理及如何将它们配置为豆子:
所有XML变换器都扩展了以下摘要变换器或摘要PayloadTransformer因此实现转换器. 在 Spring Integration 中将 XML 变换器配置为豆子时,通常会配置转换器与消息变换处理程序. 这使得变换器可以作为端点使用。最后,我们讨论命名空间支持,允许将变换器配置为XML中的元素。
解绑定变换金刚
一解绑定变换金刚让一个XML源通过使用 Spring OXM 的实现实现实现,实现非编组 Unmarshaller. Spring的对象/XML映射支持提供了多个实现,支持通过JAXB、Castor、JiBX等工具进行封组和解封组。解封组器需要一个实例源. 如果消息有效载荷不是源,转换仍在尝试中。 现在字符串,文件,字节[]和org.w3c.dom.Document支持有效载荷。创建自定义转换到源,你可以对源工厂.
如果你没有明确设置源工厂,在解绑定变换金刚默认情况下,是DomSourceFactory. |
从5.0版本开始,解绑定变换金刚同时支持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>
用转换器编组
这转换器编组允许通过使用 Spring OXM 将对象图转换为 XML马歇勒. 默认情况下,转换器编组返回 aDomResult. 不过,你可以通过配置替代方案来控制结果类型ResultFactory如字符串结果工厂. 在许多情况下,将有效载荷转换为替代的XML格式更为方便。为此,可以配置结果变换器. Spring 集成提供了两种实现,一种转换为字符串还有一个可以转换为公文. 以下示例配置了一个可转换为文档的编组变换器:
<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>
默认情况下,转换器编组将有效载荷对象传递给马歇勒. 然而,如果是布尔值extract有效载荷属性设置为false,整个消息实例传递给马歇勒相反。 这对某些自定义实现可能有用马歇勒接口,但通常,当你委派给各种马歇勒实现。
XsltPayloadTransformer
这XsltPayloadTransformer通过使用可扩展样式表语言转换(XSLT)转换XML负载。变换器的构造函数要求传递资源或模板实例。传递模板实例允许对转换器工厂用于创建模板实例。
与解绑定变换金刚这XsltPayloadTransformer实际的XSLT变换对源. 因此,如果消息有效载荷不是源,转换仍在尝试中。字符串和公文有效载荷直接支持。
创建自定义转换到源,你可以对源工厂.
如果源工厂未被明确设置,且 的性质XsltPayloadTransformer默认情况下,是DomSourceFactory. |
默认情况下,XsltPayloadTransformer生成一个带有结果有效载荷,类似于XmlPayloadMarshallingTransformer.
您可以通过提供ResultFactory或者结果变换器.
以下示例配置了一个可作为XSLT有效载荷转换器的豆子:
<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 开始,你可以通过构造函数参数指定变换器工厂类名称。
你可以通过使用转换器工厂级属性,当你使用命名空间时。
用结果变换器实现
两者转换器编组以及XsltPayloadTransformer让你指定一个结果变换器.
因此,如果编组或XSLT变换返回结果你也可以选择使用结果变换器以变换结果换成另一种形式。
Spring Integration 提供了两个具体结果变换器实现:
默认情况下,转换器编组总是返回结果.
通过指定一个结果变换器你可以自定义返回的有效载荷类型。
对于XsltPayloadTransformer.
默认情况下,如果输入载荷是字符串或公文这结果变换器财产被忽视。
然而,如果输入有效载荷是源或任何其他类型,结果变换器财产适用。
此外,你还可以设置alwaysUseResultFactory属性到true,这也导致了指定的结果变换器被使用。
更多信息和示例请参见命名空间配置和结果变换器。
XML 变换器的命名空间支持
所有XML变换器的命名空间支持均在Spring Integration XML命名空间中提供,之前已展示其模板。
变换器对命名空间的支持会创建以下EventDrivenConsumer或民调消费者,根据所提供输入信道的类型。
命名空间支持旨在通过创建一个使用同一元素的端点和变换器来减少XML配置量。
使用解绑定变换金刚
命名空间支持解绑定变换金刚如下所示。
由于命名空间创建的是端点实例而非变换器,你可以在元素内嵌套轮询器来控制输入通道的轮询。
以下示例展示了如何实现:
<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/>
使用转换器编组
对编组变换器的命名空间支持需要输入通道一输出通道,以及对马沙勒.
你可以使用可选的结果类型属性来控制生成的结果类型。
有效值为字符串结果或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作为设置结果类型属性通过使用结果工厂属性。
这结果类型和结果工厂属性是互斥的。
在内部,字符串结果和DomResult结果类型由以下表示ResultFactory实现:字符串结果工厂和DomResultFactory分别。 |
使用XsltPayloadTransformer
对XsltPayloadTransformer让你要么通过一个资源(为了创建模板实例)或传入预设的模板实例作为参考。
与分组转换器类似,你可以通过指定以下任一参数来控制结果输出的类型结果工厂或者结果类型属性。
当你需要在发送前转换结果时,可以使用结果变换器属性用于引用 的实现结果变换器.
如果你指定结果工厂或者结果类型属性,该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"/>
你可能需要获得访问权限消息数据,例如消息以协助转换。
例如,你可能需要获得某些访问权限消息并作为参数传递给变换器(例如,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-头部属性。
在它里,你可以用万用卡进行简单的模式匹配。
它支持以下简单的图案样式:xxx*,xxx,*xxx和xxx*yyy.
你也可以通过使用<xslt-param/>元素。
在该元素上,你可以设置表达属性或值属性。
这表达属性应为任何有效的 SpEL 表达式,且消息是表达式评估上下文的根对象。
这值属性(与任意值在Spring Beans中)允许你指定简单的标量值。
你也可以使用属性占位符(例如${some.value}).
所以,使用表达和值属性,你可以将XSLT参数映射到任意可访问的部分消息以及任何字面意义。
从 Spring Integration 3.0 开始,你现在可以通过设置转换器工厂级属性。
命名空间配置与结果变换器
我们讨论了在用结果变换器实现.
本节示例使用 XML 命名空间配置来展示几个特殊用例。
首先,我们定义结果变换器,如下示例所示:
<beans:bean id="resultToDoc" class="o.s.i.xml.transformer.ResultToDocumentTransformer"/>
这结果变换器接受字符串结果或者DOMResult作为输入,并将输入转换为公文.
现在我们可以声明变换器如下:
<int-xml:xslt-transformer input-channel="in" output-channel="fahrenheitChannel"
xsl-resource="classpath:noop.xslt" result-transformer="resultToDoc"/>
如果收到消息的有效载荷是源,那么,作为第一步,结果通过使用ResultFactory.
因为我们没有指定ResultFactory,默认DomResultFactory使用的是,意味着变换得到一个DomResult.
然而,正如我们指定了结果变换器,它被使用,结果消息有效载荷类型为公文.
指定的结果变换器被忽略,满足字符串或公文负载。
如果收到消息的有效载荷是字符串,XSLT 变换后的有效载荷为字符串.
同样,如果收到的消息的有效载荷类型为公文,XSLT 转换后的有效载荷是“文档”。 |
如果消息有效载荷不是源一个字符串,或公文作为备选方案,我们尝试通过默认创建“源代码”源工厂.
因为我们没有指定源工厂具体通过使用源工厂属性,默认值DomSourceFactory被使用。
如果成功,XSLT 转换将以负载类型 为 的样子执行源如前述段落所述。
这DomSourceFactory支持创建DOMSource来自公文一个文件,或字符串有效载荷。 |
下一个变换器声明会添加一个结果类型属性使用字符串结果作为它的价值。
这结果类型内部表示为字符串结果工厂.
因此,你也可以添加一个引用字符串结果工厂,通过使用结果工厂属性,这本来是一样的。
以下示例展示了转换器声明:
<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被使用。
因此,如果你变换一个类型的有效载荷字符串,所得有效载荷类型为公文.
[[xsltpayloadtransformer-and-<xsl:output-method=-text-/>]]
===XsltPayloadTransformer和<xsl:output method=“text”/>
<xsl:output method=“text”/>告诉 XSLT 模板只从输入源生成文本内容。
在这种情况下,我们没有理由使用DomResult.
因此,XsltPayloadTransformer默认为字符串结果如果输出性质方法基础javax.xml.transform.Transformer返回文本.
这种强制执行独立于入站有效载荷类型。
这种行为只有在你设置结果类型属性或结果工厂属性<int-xml:xslt-transformer>元件。