2013-02-12 55 views
1

在将Jax-WS生成的SOAP消息发送到服务器之前,是否可以将其作为字符串操作?我想在发送和修改一些标签之前截取消息。将soap消息作为字符串操纵

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

我已经看到类似的轴,但我没有找到如何用Jax-WS做到这一点。

谢谢。

更新:我已经尝试使用处理程序(SOAP和逻辑处理程序)。我的问题是,即使在使用处理程序修改它之后,Jax-WS也会更改该消息。我的SOAP消息的身体需要看起来像这样:

<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创建包含环境的文档。

2)将其转换为字符串并调整CTe标记的名称空间声明(使用String.replace)。

3)将xml字符串添加到cteDadosMsg。 Jax-WS转义字符(例如替换<为&lt;)。 Web服务不理解具有转义字符的xml。

4)增加了一个LogicalHandler来消除负载(替换&lt;,<等)。

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

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

回答

2

您可以使用Handlers来做同样的事情。有关更多详细信息,请参阅here

+0

嗨Jayamohan,谢谢你的答案。我试图使用处理程序,但它不起作用。我更新了我原来的问题,解释了原因...... – 2013-02-12 13:04:21