【问题标题】:getting raw payload from JAX-WS service从 JAX-WS 服务获取原始负载
【发布时间】:2015-07-23 16:41:24
【问题描述】:

拥有一个基于 SOAP 且带有 XML 有效负载的 Web 服务,我如何在 JAX-WS >2.0 客户端中获取服务响应的 XML 有效负载?

我可以看到这个问题将如何被标记为重复,但请耐心等待。

似乎选项是:

  1. 使用Dispatch API。但是,这将需要我降低(er)级别并手动创建请求有效负载,这是我想避免的。

  2. 使用 JAX-WS 的 handler infrastructure 获取有效负载并可能通过 MessageContext 属性将其传递回客户端,但这仍会将 XML 解组为 JAXB 对象树,这是我想避免的。

那么,我该怎么做:

  1. 使用 SEI 调用 Web 服务 - 无需从头开始创建 XML 请求
  2. 在不进行 JAXB 解组的情况下获取“RAW”XML 响应

听起来很简单,对吧?

【问题讨论】:

  • 您使用的是哪种实现方式? CXF?地铁?
  • @Namphibian 有关系吗?我想以符合 JAX-WS >2.0 的方式来做,因为环境是混合的,有些是 Axis2,有些是 CXF
  • 是的,因为每个实现都不同。
  • 嗯,但它们都符合 JAX-WS,所以我正在寻找符合规范的方式,而不是特定于实现的方式

标签: java xml web-services jaxb jax-ws


【解决方案1】:

在非目标中,JAX-WS 2 规范说 '可插入数据绑定 JAX-WS 2.0 将数据绑定推迟到 JAXB[10];提供一个 插件 API 允许使用其他类型的数据绑定技术来代替 JAXB。然而, JAX-WS 2.0 将保持选择性禁用数据绑定以提供基于 XML 的能力 片段适合用作替代数据绑定技术的输入。'

因此,您应该能够访问原始有效负载。

以下示例也在规范中:

4.3.5.5 异步、回调、面向负载

class MyHandler implements AsyncHandler<Source> {

...
public void handleResponse(Response<Source> res) {
Source resMsg = res.get();
// do something with the results
}
}
Source reqMsg = ...;
Service service = ...;
Dispatch<Source> disp = service.createDispatch(portName,
Source.class, PAYLOAD);
MyHandler handler = new MyHandler();
disp.invokeAsync(reqMsg, handler);

由于规范还声明 Binding 有自己的 HandlerChain(参见第 9 章),您应该能够从链中删除 JAXB 处理程序,这样就不会涉及 JAXB 编组/解组。

【讨论】:

  • 您好,谢谢您的回答。我需要一些时间来评估这一点。您引用的 JAX-WS 2.0 规范的第 4.3.5.5 节指的是 Dispatch API。我以为你的想法是你“手动”做所有事情,包括创建消息,但也许我需要再通读一遍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
相关资源
最近更新 更多