在将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 <
)。 Web服务无法识别带有转义字符的xml。
4)添加了一个LogicalHandler来取消有效负载(将<
替换为&lt;等等)。
5)执行此操作后, Jax-WS再次调整名称空间声明,我的CTe标记的xmlns属性消失。 :P那是我的问题。即使在使用处理程序修改消息之后,Jax-WS也“修复”了消息。
我没有将Jaxb生成的xml作为字符串添加,而是尝试将其添加为Document。我没有转义的问题,但我仍然无法为每个CTe标记重复名称空间声明。 当我解决这个问题时,我仍然需要签署一些xml的标签。所以我真的想在发送之前拦截消息并将其修改为字符串。 我错过了什么吗?