java - 将 SOAP 消息作为字符串进行操作

标签 java jax-ws webservice-client

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

我想这样做是因为我需要向服务器发送 SOAP 请求。该请求的一个标签有很多xml文档作为其内容。对于每个文档,我需要在某些标签中重新声明 namespace (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 创建包含 eniCTe 的文档。

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

3) 将 xml 字符串添加到 cteDadosMsg 中。 Jax-WS 对字符进行转义(例如,将 < 替换为 <)。 Web 服务无法理解带有转义字符的 xml。

4) 添加了一个 LogicalHandler 用于对有效负载进行转义(将 < 替换为 < 等)。

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

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

最佳答案

您可以使用处理程序执行相同的操作。请参阅here了解更多详情。

关于java - 将 SOAP 消息作为字符串进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14824033/

相关文章:

java - HashMap 第一个键为空

java - 重用 javax.xml.ws.Service 对象安全吗?

java - 没有 sun-jaxws.xml 的 Tomcat 上的 JAX-WS Web 服务

java - ERROR 411 在 java 中使用 API(POST 方法)

java - JMS错误: can not send into foreign destinations

java - 将 Sonar、Jacoco、Gradle、ScalaTest 与 Junit、Java 集成

java - 如何正确使用 JdbcTemplate.update 和 KeyHolder?

java - Web 方法中 JAXB 参数的 JAX-WS 端点发布问题

javax.net.ssl.SSLHandshakeException : sun. 安全.validator.ValidatorException

webservice-client - 使用 Ws 导入创建客户端不生成服务和端口类