是否可以在将 Jax-WS 生成的 SOAP 消息作为字符串发送到服务器之前对其进行操作?我想在消息发送之前截取消息并修改一些标签。
我想这样做是因为我需要向服务器发送一个 SOAP 请求。这个请求的一个标签有很多xml文档作为它的内容。对于每个文档,我需要在一些标签中重新声明命名空间(Jax-WS 智能地只声明一次)。我不能使用任何前缀。我也需要签署xml。如果我可以将消息作为字符串进行操作,那么所有这些问题都会更容易解决。
我已经看到与axis类似的东西,但我没有找到如何使用Jax-WS来做到这一点。
谢谢你。
更新:我已经尝试过使用处理程序(SOAP 和逻辑处理程序)。我的问题是,即使我使用处理程序修改了消息,Jax-WS 也会更改消息。我的肥皂消息的正文需要如下所示:
<soap12:Body>
<cteDadosMsg xmlns="http://www.portalfiscal.inf.br/cte/wsdl/CteRecepcao">
<enviCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="1.04">
<idLote>1</idLote>
<CTe xmlns="http://www.portalfiscal.inf.br/cte">
</CTe>
<CTe xmlns="http://www.portalfiscal.inf.br/cte">
</CTe>
</enviCTe>
</cteDadosMsg>
</soap12:Body>
看我的 CTe 标记需要重复命名空间声明(与 enviCTe 使用的相同)。我尝试执行以下步骤:
1) 使用 Jaxb 创建了包含 enviCTe 的文档。
2)将其转换为字符串并调整CTe标签的命名空间声明(使用String.replace)。
3) 将 xml 字符串添加到 cteDadosMsg。Jax-WS 对字符进行转义(例如替换 < <
)。Web 服务不理解带有转义字符的 xml。
4) 添加了一个LogicalHandler 用于解除payload 的转义(替换<
为< 等等)。
5) 完成此操作后,Jax-WS 再次调整命名空间声明,我的 CTe 标记的 xmlns 属性消失。:P 那是我的问题。Jax-WS 甚至在使用处理程序修改消息之后“修复”消息。
我没有将 Jaxb 生成的 xml 添加为字符串,而是尝试将其添加为 Document。我没有转义的问题,但我仍然无法为每个 CTe 标记重复命名空间声明。当我解决这个问题时,我仍然必须签署 xml 的一些标签。所以我真的很想在消息发送之前拦截消息并将其修改为字符串。我错过了什么吗?