将肥皂消息操作为字符串

时间:2013-02-12 01:28:52

标签: java jax-ws webservice-client

在将Jax-WS生成的SOAP消息发送到服务器之前,是否可以将其作为String操作?我希望在发送消息之前准确拦截消息并修改一些标签。

我想这样做是因为我需要向服务器发送SOAP请求。此请求的标记包含许多xml文档作为其内容。对于每个文档,我需要在某些标记中重新声明名称空间(Jax-WS智能地仅声明一次)。我不能使用任何前缀。我也需要签名xml。如果我可以将消息操作为字符串,那么所有这些问题都会更容易解决。

我见过类似于轴的东西,但我没有找到如何用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; for &lt;)。 Web服务无法识别带有转义字符的xml。

4)添加了一个LogicalHandler来取消有效负载(将&lt;替换为&lt;等等)。

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用Handlers执行相同的操作。有关详细信息,请参阅here