1

当 Spring-WS 与 JAXB 一起用于编组和解组时,内部使用哪个流实现?

response = (AResponse) webSvcTemplate.marshalSendAndReceive(request);

通读 SO 查询,发现 Woodstox 比 JAXB 快。然而,当我使用 Spring-WS 时,Spring 从字面上处理了编组和解组期间发生的所有事情。

问题是如何强制 Spring-WS 使用 Woodstox 流 API?

4

1 回答 1

5

当 Spring-WS 与 JAXB 一起用于编组和解组时,内部使用哪个流实现?

这取决于WebServiceMessageFactory您启用了哪个。默认情况下,Spring-WS 使用SaajSoapMessageFactory基于 DOM 的 SAAJ(即 ),并且根本不做任何流式传输,因为整个 XML 结构都存储在内存中。您可以从 SAAJ 切换到 Axiom(即AxiomSoapMessageFactory),它确实执行基于 StAX 的流式传输。请参阅参考文档

通读 SO 查询,发现 Woodstox 比 JAXB 快。

这实际上取决于上下文:消息的大小、正在运行的硬件等。根据个人经验,我发现对于“小型”到“中型”大小的 SOAP 消息,流式传输并没有明显更快。

此外,您在这里将苹果与橙子进行比较:Woodstox 是一个 StAX 实现,一个 XML 解析器。JAXB 是一个编组库,它使用 StAX(以及 SAX 和 DOM)等解析器从 XML 构建 Java 对象。

然而,当我使用 Spring-WS 时,Spring 从字面上处理了编组和解组期间发生的所有事情。

不是很棒吗?;)

问题是如何强制 Spring-WS 使用 Woodstox 流 API?

只需将 Woodstox 放在类路径上就足够了,Spring-WS 会自动拾取它。不过,您必须先切换到 Axiom(见上文),然后才能注意到任何差异。即便如此,我敢打赌,性能差异并没有那么大。

于 2014-08-14T09:35:48.243 回答