1

是否可以在将 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 对字符进行转义(例如替换 < &lt;)。Web 服务不理解带有转义字符的 xml。

4) 添加了一个LogicalHandler 用于解除payload 的转义(替换&lt;为< 等等)。

5) 完成此操作后,Jax-WS 再次调整命名空间声明,我的 CTe 标记的 xmlns 属性消失。:P 那是我的问题。Jax-WS 甚至在使用处理程序修改消息之后“修复”消息。

我没有将 Jaxb 生成的 xml 添加为字符串,而是尝试将其添加为 Document。我没有转义的问题,但我仍然无法为每个 CTe 标记重复命名空间声明。当我解决这个问题时,我仍然必须签署 xml 的一些标签。所以我真的很想在消息发送之前拦截消息并将其修改为字符串。我错过了什么吗?

4

1 回答 1

2

您可以使用Handlers. 有关详细信息,请参阅此处

于 2013-02-12T01:39:26.797 回答